공격자가 파일 기능만 사용할 수 있는 경우 Linux에서 강화된 chroot를 탈출하는 방법은 무엇입니까?

공격자가 파일 기능만 사용할 수 있는 경우 Linux에서 강화된 chroot를 탈출하는 방법은 무엇입니까?

시스템에는 chroot 환경이 존재하며 /var/myroot, 공격자는 chroot에서 루트(EUID 0)로 실행되는 프로세스에서 임의의 기계어 실행 권한을 획득한다. 그러나 공격자가 제어하는 ​​프로세스에는 모든 기능이 활성화되어 있지 않습니다(파일 시스템 기능만). 공격자는 chroot를 탈출하고 /etc/passwdchroot 외부에 줄을 추가하려고 합니다. 그가 어떻게 그럴 수 있었습니까?

다음과 같은 보안 조치가 취해졌습니다.

  • 방지하기 위해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_NODEVMS_NOSUIDMS_NODEV/dev/sdaMS_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 파일 시스템이 마운트되지 않았습니다.
    • /devtmpfs 파일 시스템은 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 외부를 가리키는 파일 설명자가 없기 때문에 작동하지 않습니다.

관련 정보