특권 컨테이너에서는 모든 장치에 /dev/에서 접근할 수 있습니다. 따라서 디스크를 마운트하여 호스트에서 탈출할 수 있습니다.
# docker run --rm -it alpine shls/devconsolefdmqueueptmxrandomstderrstdouturandomcorefullnullptsshmstdinttyzero
# docker run --rm --privileged -it alpine shls/devcachefilesmapperportshmtty24tty44tty7consolemempsauxstderrtty25tty45tty8coremqueueptmxstdintty26tty46tty9cpunbd0ptsstdouttty27tty47ttyS0[...]
읽기 전용 커널 파일 시스템
커널 파일 시스템은 프로세스가 커널의 동작을 수정할 수 있는 메커니즘을 제공합니다. 그러나 컨테이너 프로세스의 경우, 커널에 대한 변경을 방지하고자 합니다. 따라서 우리는 커널 파일 시스템을 컨테이너 내에서 읽기 전용으로 마운트하여, 컨테이너 프로세스가 커널을 수정할 수 없도록 합니다.
# You can manually disable seccomp in docker with--security-optapparmor=unconfined
SELinux
--privileged 플래그로 컨테이너를 실행하면 SELinux 레이블이 비활성화되어 컨테이너 엔진의 레이블, 일반적으로 unconfined를 상속받아 컨테이너 엔진과 유사한 전체 접근 권한을 부여합니다. 루트리스 모드에서는 container_runtime_t를 사용하고, 루트 모드에서는 spc_t가 적용됩니다.
# You can manually disable selinux in docker with--security-optlabel:disable
영향을 미치지 않는 것
네임스페이스
네임스페이스는 --privileged 플래그의 영향을 받지 않습니다. 보안 제약이 활성화되어 있지 않더라도, 시스템이나 호스트 네트워크의 모든 프로세스를 볼 수는 없습니다. 사용자는 --pid=host, --net=host, --ipc=host, --uts=host 컨테이너 엔진 플래그를 사용하여 개별 네임스페이스를 비활성화할 수 있습니다.
# docker run --rm --privileged -it alpine shps-efPIDUSERTIMECOMMAND1root0:00sh18root0:00ps-ef
기본적으로, 컨테이너 엔진은 사용자 네임스페이스를 사용하지 않으며, 루트리스 컨테이너만 이를 사용합니다. 루트리스 컨테이너는 파일 시스템 마운팅과 여러 UID 사용을 위해 사용자 네임스페이스가 필요합니다. 루트리스 컨테이너에 필수적인 사용자 네임스페이스는 비활성화할 수 없으며, 권한을 제한하여 보안을 크게 향상시킵니다.