Docker --privileged
Reading time: 6 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
What Affects
특권이 있는 컨테이너를 실행할 때 비활성화되는 보호 기능은 다음과 같습니다:
Mount /dev
특권 컨테이너에서는 모든 장치가 /dev/
에서 접근 가능합니다. 따라서 호스트의 디스크를 마운트하여 탈출할 수 있습니다.
# docker run --rm -it alpine sh
ls /dev
console fd mqueue ptmx random stderr stdout urandom
core full null pts shm stdin tty zero
읽기 전용 커널 파일 시스템
커널 파일 시스템은 프로세스가 커널의 동작을 수정할 수 있는 메커니즘을 제공합니다. 그러나 컨테이너 프로세스의 경우, 커널에 대한 변경을 방지하고자 합니다. 따라서 커널 파일 시스템을 읽기 전용으로 컨테이너 내에 마운트하여 컨테이너 프로세스가 커널을 수정할 수 없도록 합니다.
# docker run --rm -it alpine sh
mount | grep '(ro'
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
cpuset on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
cpu on /sys/fs/cgroup/cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpu)
cpuacct on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct)
커널 파일 시스템 마스킹
/proc 파일 시스템은 선택적으로 쓰기가 가능하지만 보안을 위해 특정 부분은 tmpfs로 덮어씌워져 쓰기 및 읽기 접근이 차단되어 컨테이너 프로세스가 민감한 영역에 접근할 수 없도록 합니다.
[!NOTE] > tmpfs는 모든 파일을 가상 메모리에 저장하는 파일 시스템입니다. tmpfs는 하드 드라이브에 파일을 생성하지 않습니다. 따라서 tmpfs 파일 시스템을 언마운트하면 그 안에 있는 모든 파일은 영원히 사라집니다.
# docker run --rm -it alpine sh
mount | grep /proc.*tmpfs
tmpfs on /proc/acpi type tmpfs (ro,relatime)
tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
리눅스 기능
컨테이너 엔진은 기본적으로 컨테이너 내부에서 발생하는 일을 제어하기 위해 제한된 수의 기능으로 컨테이너를 시작합니다. 특권이 있는 경우 모든 기능에 접근할 수 있습니다. 기능에 대해 알아보려면 읽어보세요:
# docker run --rm -it alpine sh
apk add -U libcap; capsh --print
[...]
Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=eip
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
[...]
컨테이너에서 --privileged
모드로 실행하지 않고도 사용할 수 있는 기능을 --cap-add
및 --cap-drop
플래그를 사용하여 조작할 수 있습니다.
Seccomp
Seccomp는 컨테이너가 호출할 수 있는 syscalls를 제한하는 데 유용합니다. 기본적으로 도커 컨테이너를 실행할 때 기본 seccomp 프로파일이 활성화되지만, 특권 모드에서는 비활성화됩니다. Seccomp에 대해 더 알아보려면 여기를 참조하세요:
# docker run --rm -it alpine sh
grep Seccomp /proc/1/status
Seccomp: 2
Seccomp_filters: 1
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined
또한, Kubernetes 클러스터에서 Docker(또는 다른 CRI)를 사용할 때 seccomp 필터는 기본적으로 비활성화되어 있습니다.
AppArmor
AppArmor는 컨테이너를 제한된 리소스 집합에 프로그램별 프로파일로 제한하는 커널 향상 기능입니다. --privileged
플래그로 실행할 때 이 보호 기능은 비활성화됩니다.
# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined
SELinux
--privileged
플래그로 컨테이너를 실행하면 SELinux 레이블이 비활성화되어 컨테이너 엔진의 레이블을 상속받습니다. 일반적으로 unconfined
로 설정되어 컨테이너 엔진과 유사한 전체 접근 권한을 부여합니다. 루트리스 모드에서는 container_runtime_t
를 사용하고, 루트 모드에서는 spc_t
가 적용됩니다.
# You can manually disable selinux in docker with
--security-opt label:disable
영향을 미치지 않는 것
네임스페이스
네임스페이스는 --privileged
플래그의 영향을 받지 않습니다. 보안 제약이 활성화되어 있지 않더라도, 예를 들어 시스템이나 호스트 네트워크의 모든 프로세스를 볼 수는 없습니다. 사용자는 --pid=host
, --net=host
, --ipc=host
, --uts=host
컨테이너 엔진 플래그를 사용하여 개별 네임스페이스를 비활성화할 수 있습니다.
# docker run --rm --privileged -it alpine sh
ps -ef
PID USER TIME COMMAND
1 root 0:00 sh
18 root 0:00 ps -ef
사용자 네임스페이스
기본적으로, 컨테이너 엔진은 루트 없는 컨테이너를 제외하고 사용자 네임스페이스를 사용하지 않습니다. 루트 없는 컨테이너는 파일 시스템 마운팅과 여러 UID 사용을 위해 사용자 네임스페이스가 필요합니다. 루트 없는 컨테이너에 필수적인 사용자 네임스페이스는 비활성화할 수 없으며, 권한을 제한하여 보안을 크게 향상시킵니다.
참조
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.