공격자가 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.