Docker --privileged
Reading time: 7 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Co wpływa
Kiedy uruchamiasz kontener jako uprzywilejowany, wyłączasz następujące zabezpieczenia:
Montowanie /dev
W uprzywilejowanym kontenerze wszystkie urządzenia są dostępne w /dev/
. Dlatego możesz uciec 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
Systemy plików jądra tylko do odczytu
Systemy plików jądra zapewniają mechanizm, dzięki któremu proces może modyfikować zachowanie jądra. Jednak w przypadku procesów kontenerowych chcemy zapobiec ich wprowadzaniu jakichkolwiek zmian w jądrze. Dlatego montujemy systemy plików jądra jako tylko do odczytu w kontenerze, zapewniając, że procesy kontenera nie mogą modyfikować jądra.
# 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ą chronione przed dostępem do zapisu i odczytu poprzez nałożenie na nie tmpfs, co zapewnia, że procesy kontenera nie mogą uzyskać dostępu do wrażliwych obszarów.
[!NOTE] > tmpfs to system plików, który przechowuje wszystkie pliki w pamięci wirtualnej. tmpfs nie tworzy żadnych plików na twoim dysku twardym. Więc jeśli odmontujesz system plików tmpfs, wszystkie pliki w nim zawarte zostaną na zawsze utracone.
# 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)
Możliwości Linuxa
Silniki kontenerowe uruchamiają kontenery z ograniczoną liczbą możliwości, aby kontrolować, co dzieje się wewnątrz kontenera domyślnie. Privileged mają wszystkie możliwości dostępne. Aby dowiedzieć się więcej o możliwościach, przeczytaj:
# 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ć uprawnieniami dostępnymi dla kontenera bez uruchamiania w trybie --privileged
, używając flag --cap-add
i --cap-drop
.
Seccomp
Seccomp jest przydatny do ograniczenia syscalli, 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:
# 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
Również zauważ, że gdy Docker (lub inne CRI) są używane 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 z profilami per-programowymi. Gdy uruchamiasz z flagą --privileged
, ta ochrona jest wyłączona.
# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined
SELinux
Uruchomienie kontenera z flagą --privileged
wyłącza etykiety SELinux, powodując, że dziedziczy etykietę silnika kontenerowego, zazwyczaj unconfined
, przyznając pełny dostęp podobny do silnika kontenerowego. W trybie bezrootowym używa container_runtime_t
, podczas gdy w trybie rootowym stosuje spc_t
.
# 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
. Mimo że nie mają włączonych ograniczeń bezpieczeństwa, nie widzą wszystkich procesów w systemie ani hosta sieciowego, na przykład. Użytkownicy mogą wyłączyć poszczególne przestrzenie nazw, używając flag konteneró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żytkowników, z wyjątkiem kontenerów bezrootowych, które ich wymagają do montowania systemu plików i używania wielu UID. Przestrzenie nazw użytkowników, niezbędne dla kontenerów bezrootowych, nie mogą być wyłączane i znacznie zwiększają bezpieczeństwo poprzez ograniczenie uprawnień.
Odniesienia
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.