Docker โ€“privileged

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

What Affects

privileged ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋น„ํ™œ์„ฑํ™”๋˜๋Š” ๋ณดํ˜ธ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

Mount /dev

privileged ์ปจํ…Œ์ด๋„ˆ์—์„œ๋Š” ๋ชจ๋“  ์žฅ์น˜์— /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)

๋ฆฌ๋ˆ…์Šค ๊ธฐ๋Šฅ

์ปจํ…Œ์ด๋„ˆ ์—”์ง„์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ œํ•œ๋œ ์ˆ˜์˜ ๊ธฐ๋Šฅ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํŠน๊ถŒ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๋ฉด ์ฝ์–ด๋ณด์„ธ์š”:

Linux Capabilities

# 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์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด์„ธ์š”:

Seccomp

# docker run --rm -it alpine sh
grep Seccomp /proc/1/status
Seccomp:	2
Seccomp_filters:	1
```bash # You can manually disable seccomp in docker with --security-opt seccomp=unconfined ``` ๋˜ํ•œ, **Kubernetes** ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Docker(๋˜๋Š” ๋‹ค๋ฅธ CRI)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ **seccomp ํ•„ํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.**

AppArmor

AppArmor๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œํ•œ๋œ ๋ฆฌ์†Œ์Šค ์ง‘ํ•ฉ์— ํ”„๋กœ๊ทธ๋žจ๋ณ„ ํ”„๋กœํŒŒ์ผ๋กœ ์ œํ•œํ•˜๋Š” ์ปค๋„ ํ–ฅ์ƒ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. --privileged ํ”Œ๋ž˜๊ทธ๋กœ ์‹คํ–‰ํ•  ๋•Œ ์ด ๋ณดํ˜ธ ๊ธฐ๋Šฅ์€ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

AppArmor

# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined

SELinux

--privileged ํ”Œ๋ž˜๊ทธ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด SELinux ๋ ˆ์ด๋ธ”์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์ปจํ…Œ์ด๋„ˆ ์—”์ง„์˜ ๋ ˆ์ด๋ธ”, ์ผ๋ฐ˜์ ์œผ๋กœ unconfined๋ฅผ ์ƒ์†๋ฐ›์•„ ์ปจํ…Œ์ด๋„ˆ ์—”์ง„๊ณผ ์œ ์‚ฌํ•œ ์ „์ฒด ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ๋Š” container_runtime_t๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ฃจํŠธ ๋ชจ๋“œ์—์„œ๋Š” spc_t๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

SELinux

# 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) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ