Docker --privileged
Reading time: 7 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Šta utiče
Kada pokrenete kontejner kao privilegovan, ovo su zaštite koje onemogućavate:
Montiranje /dev
U privilegovanom kontejneru, svi uređaji mogu biti pristupljeni u /dev/
. Stoga možete pobeći montiranjem diska domaćina.
# docker run --rm -it alpine sh
ls /dev
console fd mqueue ptmx random stderr stdout urandom
core full null pts shm stdin tty zero
Datoteke sistema jezgra samo za čitanje
Datoteke sistema jezgra pružaju mehanizam za proces da modifikuje ponašanje jezgra. Međutim, kada su u pitanju procesi kontejnera, želimo da sprečimo da vrše bilo kakve promene na jezgru. Stoga, montiramo datoteke sistema jezgra kao samo za čitanje unutar kontejnera, osiguravajući da procesi kontejnera ne mogu modifikovati jezgro.
# 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)
Maskiranje nad kernel datotečnim sistemima
/proc datotečni sistem je selektivno zapisiv, ali iz bezbednosnih razloga, određeni delovi su zaštićeni od pisanja i čitanja preklapanjem sa tmpfs, osiguravajući da procesi u kontejneru ne mogu pristupiti osetljivim oblastima.
[!NOTE] > tmpfs je datotečni sistem koji čuva sve datoteke u virtuelnoj memoriji. tmpfs ne kreira nikakve datoteke na vašem hard disku. Dakle, ako odmontirate tmpfs datotečni sistem, sve datoteke koje se u njemu nalaze su izgubljene zauvek.
# 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 sposobnosti
Kontejnerski motori pokreću kontejnere sa ograničenim brojem sposobnosti kako bi kontrolisali šta se dešava unutar kontejnera po defaultu. Privilegovani imaju sve sposobnosti dostupne. Da biste saznali više o sposobnostima, pročitajte:
# 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
[...]
Možete manipulisati sposobnostima dostupnim kontejneru bez pokretanja u --privileged
režimu koristeći --cap-add
i --cap-drop
zastavice.
Seccomp
Seccomp je koristan za ograničavanje syscall-a koje kontejner može pozvati. Podrazumevani seccomp profil je omogućen podrazumevano prilikom pokretanja docker kontejnera, ali u privilegovanom režimu je on onemogućen. Saznajte više o Seccomp-u ovde:
# 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
Takođe, imajte na umu da kada se Docker (ili drugi CRI) koriste u Kubernetes klasteru, seccomp filter je onemogućen po defaultu
AppArmor
AppArmor je poboljšanje jezgra koje ograničava kontejnere na ograničen skup resursa sa profilima po programu. Kada pokrenete sa --privileged
flagom, ova zaštita je onemogućena.
# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined
SELinux
Pokretanje kontejnera sa --privileged
zastavicom onemogućava SELinux oznake, uzrokujući da nasledi oznaku kontejnerskog motora, obično unconfined
, što omogućava pun pristup sličan kontejnerskom motoru. U režimu bez root privilegija, koristi container_runtime_t
, dok se u root režimu primenjuje spc_t
.
# You can manually disable selinux in docker with
--security-opt label:disable
Šta ne utiče
Namespaces
Namespaces NISU pogođeni --privileged
oznakom. Iako nemaju omogućena bezbednosna ograničenja, ne vide sve procese na sistemu ili host mreži, na primer. Korisnici mogu onemogućiti pojedinačne namespaces koristeći --pid=host
, --net=host
, --ipc=host
, --uts=host
oznake kontejnerskog motora.
# docker run --rm --privileged -it alpine sh
ps -ef
PID USER TIME COMMAND
1 root 0:00 sh
18 root 0:00 ps -ef
Korisnički prostor
Po defaultu, kontejnerski alati ne koriste korisničke prostore, osim za kontejnerе bez root privilegija, koji ih zahtevaju za montiranje fajl sistema i korišćenje više UID-ova. Korisnički prostori, koji su ključni za kontejnerе bez root privilegija, ne mogu se onemogućiti i značajno poboljšavaju bezbednost ograničavanjem privilegija.
Reference
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.