Docker --privileged

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Šta utiče

Kada pokrenete kontejner sa privilegijama, onemogućavate sledeće zaštite:

Montiranje /dev

U privilegovanom kontejneru, svi uređaji mogu biti pristupljeni u /dev/. Stoga možete izbeći tako što ćete montirati disk 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

Kernel fajl sistemi samo za čitanje

Kernel fajl sistemi pružaju mehanizam za proces da izmeni ponašanje kernela. Međutim, kada je reč o procesima kontejnera, želimo da sprečimo da izvrše bilo kakve promene na kernelu. Zato montiramo kernel fajl sisteme kao samo za čitanje unutar kontejnera, čime osiguravamo da procesi kontejnera ne mogu da menjaju kernel.

# 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)
# docker run --rm --privileged -it alpine sh
mount  | grep '(ro'

Maskiranje preko kernel fajl sistema

Fajl sistem /proc je selektivno upisiv, ali iz bezbednosnih razloga, određeni delovi su zaštićeni od upisa i čitanja preko preklapanja sa tmpfs, čime se osigurava da procesi kontejnera ne mogu pristupiti osetljivim područjima.

tmpfs je fajl sistem koji čuva sve fajlove u virtuelnoj memoriji. tmpfs ne kreira fajlove na tvrdom disku. Dakle, ako demontirate tmpfs fajl sistem, svi fajlovi koji se u njemu nalaze su zauvek izgubljeni.

# 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

Pokretači kontejnera pokreću kontejnere sa ograničenim brojem sposobnosti kako bi kontrolisali šta se dešava unutar kontejnera prema podrazumevanim postavkama. Privilegovani kontejneri imaju sve sposobnosti dostupne. Da biste saznali više o sposobnostima, pročitajte:

pageLinux 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
[...]

Možete manipulisati sposobnostima dostupnim kontejneru bez pokretanja u --privileged režimu koristeći opcije --cap-add i --cap-drop.

Seccomp

Seccomp je koristan za ograničavanje sistemskih poziva koje kontejner može izvršiti. Podrazumevani seccomp profil je omogućen podrazumevano prilikom pokretanja Docker kontejnera, ali je onemogućen u privilegovanom režimu. Saznajte više o Seccomp-u ovde:

pageSeccomp
# 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, napomena da kada se Docker (ili drugi CRIs) koristi u Kubernetes klasteru, seccomp filter je podrazumevano onemogućen.

AppArmor

AppArmor je unapređenje jezgra za ograničavanje kontejnera na ograničen skup resursa sa profilima po programu. Kada pokrenete sa --privileged zastavicom, ova zaštita je onemogućena.

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

SELinux

Pokretanje kontejnera sa --privileged zastavicom onemogućava SELinux oznake, što rezultira nasleđivanjem oznake kontejner motora, obično unconfined, što omogućava potpuni pristup sličan kontejner motoru. U režimu bez root prava, koristi se container_runtime_t, dok se u root režimu primenjuje spc_t.

pageSELinux
# You can manually disable selinux in docker with
--security-opt label:disable

Šta ne utiče

Namespaces

Namespaces NISU pogođeni --privileged zastavicom. Iako nemaju omogućene sigurnosne restrikcije, ne vide sve procese na sistemu ili mrežu domaćina, na primer. Korisnici mogu onemogućiti pojedinačne namespaces koristeći --pid=host, --net=host, --ipc=host, --uts=host zastavice 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

Простор имен корисника

По подразумеваном, контјенерски мотори не користе простор имена корисника, осим за контјенере без корена, који их захтевају за монтирање фајл система и коришћење више УИД-ова. Простори имена корисника, који су неопходни за контјенере без корена, не могу бити онемогућени и значајно повећавају безбедност ограничавањем привилегија.

Референце

Научите хаковање AWS-а од нуле до хероја са htARTE (HackTricks AWS Red Team Expert)!

Last updated