시스템에는 chroot 환경이 존재하며 /var/myroot
, 공격자는 chroot에서 루트(EUID 0)로 실행되는 프로세스에서 임의의 기계어 실행 권한을 획득한다. 그러나 공격자가 제어하는 프로세스에는 모든 기능이 활성화되어 있지 않습니다(파일 시스템 기능만). 공격자는 chroot를 탈출하고 /etc/passwd
chroot 외부에 줄을 추가하려고 합니다. 그가 어떻게 그럴 수 있었습니까?
다음과 같은 보안 조치가 취해졌습니다.
- 방지하기 위해chdir("..") chroot 이스케이프 기술, chroot 환경에 들어가는 데 사용피벗_루트(2)대신에chroot(2). 보다jchroot.c어떻게 해야 하나요?
- chroot의 첫 번째 프로세스가 시작되면 chroot 외부를 가리키는 파일 설명자를 열지 않습니다.
- chroot의 각 프로세스는 최대
CAP_CHROOT
,CAP_FOWNER
,CAP_FSETID
,CAP_CHOWN
,CAP_DAC_OVERRIDE
,CAP_DAC_READ_SEARCH
기능을 가지며 다른 프로세스를 얻을 수 없습니다CAP_SETGID
.CAP_SETUID
즉, 공격자는 권한 검사 등을 우회하여 임의의 파일 시스템 읽기 및 쓰기를 수행할 수 있지만, 프로세스에 임의의 신호를 보내CAP_KILL
거나( ) 네트워크에서 임의의 패킷을 보내거나(CAP_NET_RAW
) 시스템을 재부팅하거나(CAP_SYS_BOOT
) 수정하는 것은 불가능합니다. 메모리의 바이트(CAP_SYS_RAWIO
) 등 unshare(CLONE_NEWUSER)
예전에는아니요호출되면 chroot 프로세스의 UID 0은 chroot 외부의 UID 0과 동일합니다.unshare(CLONE_NEWPID)
공격자가 chroot 외부에서 실행 중인 프로세스를 볼 수 없도록 호출됩니다.unshare(CLONE_NEWNS)
chroot가 설정되고 다음 파일 시스템이 표시될 때 호출됩니다./var/chroot
로 표시되고 으로/
다시 설치됩니다 . ( 공격자가 쓸 수 없도록 사용하고 , 파일 함수에서 공격자가 새로운 기능을 얻을 수 없도록 사용한다.)MS_NODEV
MS_NOSUID
MS_NODEV
/dev/sda
MS_NOSUID
- proc 파일 시스템이 표시되고
/proc
다음 경로가 제거됩니다(빈 파일을 넣기 위해 바인드 마운트를 사용하여):/proc/kcore
,/proc/latency_stats
,/proc/timer_list
,/proc/timer_stats
,/proc/sched_debug
,/proc/scsi
및 다음 경로는 읽기 전용으로 설정됩니다:/proc/asound
,/proc/bus
,/proc/fs
,/proc/irq
,/proc/sys
,/proc/sysrq-trigger
. - sysfs 파일 시스템이 마운트되지 않았습니다.
- devpts 파일 시스템이 마운트되지 않았습니다.
/dev
tmpfs 파일 시스템은MS_NODEV
일부 장치 없이 마운트되고 미리 채워져 있습니다.- chroot에서는 다른 파일 시스템을 볼 수 없습니다.
- 블록 장치 노드는 chroot에서 사용할 수 없습니다(
CAP_MKNOD
공격자가 생성할 수 없도록 사용할 수 없음). - 다음 문자 장치 노드만 사용할 수 있습니다:
/dev/null
,/dev/zero
,/dev/full
,/dev/random
,/dev/urandom
,/dev/tty
,/dev/ptmx
( 와 동일/dev/pts/ptmx
) 및 a/dev/pts/X
(chroot 외부에서 사용되는 터미널). - 공격자가 chroot를
ioctl(..., TIOCSTI, ...)
호출(입력된 입력 시뮬레이션)/dev/pts/X
하고 종료하는 경우 chroot 외부의 대화형 셸은 이러한 시뮬레이션된 바이트를 읽을 수 있으므로 다음을 시뮬레이션하는 것이 유용할 수 있습니다sudo sh -c 'echo pwned::0:0:pwned:/:/bin/bash >>/etc/passwd'
. 이것이 성공하지 못하도록 chroot에 생성된 프로세스의 상위 프로세스는 쉘로 돌아가기 전에 모든 터미널 입력을 플러시합니다.
참고로 제 사용 사례는 다음과 같습니다: 저는 Debian 시스템을 가지고 있습니다 /var/myroot
(아마도부팅 방지 프로그램), 악성 패키지에 스크립트를 설치하여 호스트 시스템을 공격에 노출시키지 않고 신뢰할 수 없는 패키지를 설치할 수 있기를 원합니다. 불행하게도 sudo chroot /var/myroot apt-get install MALICIOUS-PACKAGE
충분히 안전하지 않습니다. 예를 들어 패키지의 설치 스크립트는 블록 장치 노드를 생성하고 /dev/sda1
거기 /etc/passwd
에서 파일을 찾아서 수정하여 chroot에서 탈출할 수 있기 때문입니다. 나는 지금 충분히 안전한 다른 옵션이 무엇인지 조사 중입니다. 위에서 언급한 대로 chroot를 강화하는 것이 하나의 후보입니다. (이 질문에서는 다른 후보를 찾는 것이 아닙니다.) 이 질문에서는 얼마나 안전한지 알고 싶습니다.
참고로 명령줄 도구가 있습니다.chw00tchroot에서 탈출하세요. 기술 정보:
- -0은 여기서 작동하지 않습니다. 왜냐하면피벗_루트(2)사용되었습니다.
- -1은 사용 가능한 chroot 외부를 가리키는 파일 설명자가 없기 때문에 효과가 없습니다.
- -2 작동할 수도 있습니다. 적용되는지 확인해야 합니다.피벗_루트(2).
- -3은 작동하지 않습니다. 왜냐하면공유 취소(CLONE_NEWPID)호출됩니다.
- -4는 블록 장치를 사용할 수 없기 때문에 작동하지 않습니다.
- -5가 작동할 수도 있습니다. 작동하는지 확인해야 합니다.피벗_루트(2).
- -6은 작동하지 않습니다. 왜냐하면공유 취소(CLONE_NEWPID)호출됩니다.
- -7은 사용 가능한 chroot 외부를 가리키는 파일 설명자가 없기 때문에 작동하지 않습니다.