Docker --privileged

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Co wpływa

Kiedy uruchamiasz kontener jako uprzywilejowany, wyłączasz następujące zabezpieczenia:

Montowanie /dev

W kontenerze uprzywilejowanym wszystkie urządzenia są dostępne w /dev/. Dlatego można ujść przez zamontowanie dysku hosta.

# docker run --rm -it alpine sh
ls /dev
console  fd       mqueue   ptmx     random   stderr   stdout   urandom
core     full     null     pts      shm      stdin    tty      zero

System call filtering

System calls are the interface between user space and the kernel. By filtering system calls, we can restrict the actions that container processes can perform. Docker provides a feature called seccomp that allows us to filter system calls and define a whitelist of allowed system calls for container processes.

# 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)

Maskowanie systemów plików jądra

System plików /proc jest selektywnie zapisywalny, ale dla bezpieczeństwa niektóre części są zabezpieczone przed zapisem i odczytem przez nałożenie na nie tmpfs, co zapewnia, że procesy kontenera nie mogą uzyskać dostępu do wrażliwych obszarów.

tmpfs to system plików, który przechowuje wszystkie pliki w pamięci wirtualnej. tmpfs nie tworzy żadnych plików na dysku twardym. Jeśli odmontujesz system plików tmpfs, wszystkie pliki w nim zostaną utracone na zawsze.

# 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)

Linuxowe uprawnienia

Silniki kontenerów uruchamiają kontenery z ograniczoną liczbą uprawnień, aby kontrolować to, co dzieje się wewnątrz kontenera domyślnie. Uprawnienia uprzywilejowane mają dostęp do wszystkich uprawnień. Aby dowiedzieć się więcej o uprawnieniach, przeczytaj:

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żesz manipulować dostępnymi możliwościami dla kontenera bez uruchamiania go w trybie --privileged, używając flag --cap-add i --cap-drop.

Seccomp

Seccomp jest przydatny do ograniczania wywołań syscalls, które kontener może wywołać. Domyślny profil seccomp jest włączony domyślnie podczas uruchamiania kontenerów Docker, ale w trybie uprzywilejowanym jest wyłączony. Dowiedz się więcej o Seccomp tutaj:

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

Dodatkowo, należy zauważyć, że gdy Docker (lub inne CRIs) jest używany w klastrze Kubernetes, filtr seccomp jest domyślnie wyłączony.

AppArmor

AppArmor to ulepszenie jądra, które ogranicza kontenery do ograniczonego zestawu zasobów za pomocą profilów dla poszczególnych programów. Gdy uruchamiasz z flagą --privileged, ta ochrona jest wyłączona.

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

SELinux

Uruchomienie kontenera z flagą --privileged wyłącza etykiety SELinux, powodując dziedziczenie etykiety silnika kontenera, zwykle unconfined, co daje pełny dostęp podobny do silnika kontenera. W trybie bez uprawnień roota używane jest container_runtime_t, podczas gdy w trybie roota stosowane jest spc_t.

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

Co nie ma wpływu

Przestrzenie nazw

Przestrzenie nazw NIE są dotknięte flagą --privileged. Chociaż nie mają włączonych ograniczeń bezpieczeństwa, nie widzą wszystkich procesów w systemie ani sieci hosta, na przykład. Użytkownicy mogą wyłączyć poszczególne przestrzenie nazw, używając flag kontenerów silników --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

Przestrzeń nazw użytkownika

Domyślnie, silniki kontenerów nie wykorzystują przestrzeni nazw użytkownika, z wyjątkiem kontenerów bez uprawnień root, które wymagają ich do montowania systemu plików i korzystania z wielu UID. Przestrzenie nazw użytkownika, niezbędne dla kontenerów bez uprawnień root, nie mogą być wyłączone i znacznie zwiększają bezpieczeństwo poprzez ograniczenie uprawnień.

Referencje

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Last updated