공격자가 mkdir을 사용하여 시스템을 손상시킬 수있는 방법이 있습니까?


22

ricardo시스템에서 번거로운 사용자 인 user에 대한 제한된 사용자 계정을 설정하고 있습니다. 나는 그를 사용하여 디렉토리를 만들 수있는 권한을 부여하고 싶습니다 sudo. 내 /etc/sudoers파일 에서이 규칙을 고려하고 있습니다.

ricardo   ALL=(root) NOPASSWD: /bin/mkdir

이 규칙 만 사용하면 ricardo가 의도적으로 또는 실수로 시스템을 손상시킬 수있는 방법이 있습니까?


2
정적 inode 수를 가진 파일 시스템이 있으면 모든 inode를 사용할 수 있습니다.
jordanm

2
@schaiba 그는 땜질을 좋아하고 그가 시스템을 악용 할 수 있는지 확인하고 매뉴얼 페이지를 항상 읽어야하는 것은 아닙니다.
Ricardo Altamirano

8
당시에는 sudo가없는 적절한 사용자 교육이 나에게 권장되는 일입니다.
schaiba

2
@schaiba가 말했듯이, 그러한 사용자를 가르치고 책임을 져야합니다 (면밀한 감독하에). 첫 번째 시스템이 시스템을 너무 많이 잠그려고했기 때문에 sysdamins와 사용자 사이의 전쟁을 보았습니다. 사용자는 sysadmins의 수를 10 대 1로 넘었고 , 심지어 오늘날의 인터넷 액세스 없이도 sysdamins의 패배는 굴욕적이었습니다. 그런 자세로 들어 가지 마십시오 !
vonbrand

2
하나의 리카르도가 너무 많은 경우입니다. 아니면 적어도 이렇게 BOFH를 말했다.
Deer Hunter

답변:


21

«something»은 rootfs가 마운트 된 후에로드를 시도하는 커널 모듈 인 다음과 같은 공격이 효과가있을 것으로 생각됩니다.

$ sudo mkdir -m 777 /lib/modules/`uname -r`/a
$ cp evil.ko /lib/modules/`uname -r`/a/«something».ko

모듈에 선언 된 별명에 따라 다른 이름을 사용할 수도 있습니다. depmod가 실행될 때까지로드되지 않을 것입니다. 다음 번에 커널 업데이트가있을 때 발생하므로 mkdirsudo 로그에 최근에 표시되지 않습니다.

/ etc에는 디렉토리의 모든 파일을 재귀 적으로 읽는 많은 것들이 있습니다. 더 나쁜 것은 이러한 디렉토리 중 일부는 기본적으로 존재하지 않으며 디렉토리를 사용하는 프로그램에 대한 맨 페이지, 초기화 스크립트 등을 읽는 것입니다. 심지어 더 나쁜 것은 이전 버전과의 호환성이 더 이상 사용되지 않으며 더 이상 문서화되지 않을 수도 있습니다.

편집 : 몇 가지 디렉토리가 더 있다고 생각했습니다 /usr/local.

  • /usr/local/lib/perl/5.14.2(펄 버전에 따라 다릅니다 perl -V.) File거기 에 서브 디렉토리를 작성하고 Find.pm그것을 넣으 십시오. 이제 누구나 누구나를 사용할 때마다 File::Find공격자의 버전을 사용하게됩니다. 마찬가지로와 동일하게 수행하십시오 Getopt::Long. 시스템 유틸리티는 종종 Perl로 작성되므로 루트가 될 수 있습니다. (보십시오 ack-grep --color -a 'use.+::' /usr/sbin | less -R)
  • 파이썬, 루비 등은 비슷한 디렉토리를 가지고 있다고 생각합니다. 시스템 유틸리티도 Python으로 작성되었습니다.
  • 누군가가의 하위 디렉토리로 컴파일하는 많은 것들을 파괴하십시오 /usr/local/include.

그러나 <evil user>가 커널이로드 할 위치로 모듈을 복사 할 수 있다면 게임은 시작하기 전에 끝난 것입니다.
vonbrand

1
@vonbrand <evil user>는 일반적으로 할 수 없지만 그의 sudo mkdir디렉토리를 사용하여 그가 할 수있는 새 디렉토리를 만들었습니다.
derobert

20

mkdir루트 로 실행함으로써 , 사용자는 이전에 동일한 이름 (및 / 또는 잘못된 권한)을 가진 디렉토리를 작성하여 다른 프로세스 / 사용자가 새 파일 및 디렉토리를 작성하는 것을 차단할 수 있습니다.

이것은 특히 로그 및 잠금 파일 과 관련된 보안 일 수 있습니다 .

마찬가지로 jordanm는 주목의 최대 개수 의 inode는 또한 전체 시스템을 차단할 수까지 사용할 수있다.

특정 그룹에 사용자를 추가하거나 ACL을 사용 하면을 통해 권한을 부여하지 않고도 문제를 해결할 수 있습니다 sudo.


좋은 지적. 아마도 mkdirricardo가 사용할 수있는 명령 목록을 생략 할 것입니다.
Ricardo Altamirano

아이 노드를 소진하는 경우 간단한 작업 for((i = 0;; i++)); do touch $i; done을 수행하면됩니다 (부 시즘, 미안하지만 아이디어를 얻습니다).
vonbrand

@vonbrand 루트가 아닌 것을 제외하면 할당량에 의해 중지됩니다. 물론 sudoOP가 고려 하고있는 다른 명령들도 아이 노드를 소진시킬 수있다. OP는 해당 DoS 벡터를 알고 있어야합니다.
derobert

11

당신은 그를 chroot 교도소로 리디렉션해야합니다. 또는 작은 VM에서는 한 시간에 한 번씩 충돌 할 수 있습니다. 새 사본을 제공하기 만하면됩니다.


나는 이것을 강력히 추천한다. 자신의 VM에 대한 루트 액세스 권한을 부여하십시오.
emory

chroot ^ H ^ H ^ H ^ H ^ Hounty jail ...
사슴 사냥꾼

6

쓰기 권한이있는 디렉토리를 만들 수 있기 때문에 가능성이 있습니다. 함께 사용자가 새로운 디렉토리에 원하는대로 쓸 수 있습니다. 디렉토리 트리를 되풀이하여 구성, 스크립트 또는 모듈을로드하는 다른 사용자로 이미 실행중인 시스템에서 프로세스가 필요합니다. 그런 다음 사용자는로드하거나 실행할 자신의 항목을 추가 할 수 있습니다. 내가 생각할 수있는 첫 번째 것은 PHP 또는 CGI를 실행할 수있는 웹 서버를 실행하는 것입니다. 그런 다음 해당 사용자로 스크립트를 실행할 수 있습니다. 나는 더 실제적인 예, 특히 그 예를 생각해 내기 위해 고심하고 있지만 확실합니다. mkdir -m 777 blahricardoroot

ssh는 이런 종류의 시나리오를 잡아내는 데몬의 예입니다. .ssh디렉토리가없는 사용자 의 디렉토리를 작성하고 자신의 authorized_hosts파일을 제자리에 둔 경우 sshd디렉토리 권한이 너무 열려 있고 공개 키를 무시합니다.

많은 프로그램이 잘 처리하지 못하는 파일 (예 : 임시 tmp 또는 스왑 파일)이 켜질 것으로 예상되는 디렉토리를 작성하는 것은 확실히 귀찮게 만들 수 있습니다.

많은 cgroup을 만들 수는 있지만 아무 것도 수행하지 않는 것 같습니다. 적어도 무릎을 꿇고 시스템을 가져올 수 있습니다. OOM 킬러 가 sshd를 꺼내려면 256M 상자에 약 10000 cgroup이 필요했습니다 .

환경 의 -m옵션 mkdir과 UMASK 를 제어하면 sudo귀찮은 것으로 돌아갑니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.