Pracujesz w firmie zajmującej się cyberbezpieczeństwem? Chcesz zobaczyć swoją firmę reklamowaną w HackTricks? A może chcesz mieć dostęp do najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF? Sprawdź PLAN SUBSKRYPCYJNY!
Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do repozytorium hacktricks i hacktricks-cloud.
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 shls/devconsolefdmqueueptmxrandomstderrstdouturandomcorefullnullptsshmstdinttyzero
# docker run --rm --privileged -it alpine shls/devcachefilesmapperportshmtty24tty44tty7consolemempsauxstderrtty25tty45tty8coremqueueptmxstdintty26tty46tty9cpunbd0ptsstdouttty27tty47ttyS0[...]
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 --privileged -it alpine shmount|grep'(ro'
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 shmount|grep/proc.*tmpfstmpfson/proc/acpitypetmpfs (ro,relatime)tmpfson/proc/kcoretypetmpfs (rw,nosuid,size=65536k,mode=755)tmpfson/proc/keystypetmpfs (rw,nosuid,size=65536k,mode=755)
# docker run --rm --privileged -it alpine shmount|grep/proc.*tmpfs
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 wszystkichuprawnień. Aby dowiedzieć się więcej o uprawnieniach, przeczytaj:
# docker run --rm -it alpine shapkadd-Ulibcap; 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
[...]
# docker run --rm --privileged -it alpine shapkadd-Ulibcap; capsh--print[...]Current:=eipcap_perfmon,cap_bpf,cap_checkpoint_restore-eipBounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
[...]
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:
# docker run --rm -it alpine shgrepSeccomp/proc/1/statusSeccomp:2Seccomp_filters:1
# docker run --rm --privileged -it alpine shgrepSeccomp/proc/1/statusSeccomp:0Seccomp_filters:0
# You can manually disable seccomp in docker with--security-optseccomp=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.
# You can manually disable seccomp in docker with--security-optapparmor=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.
# You can manually disable selinux in docker with--security-optlabel: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 shps-efPIDUSERTIMECOMMAND1root0:00sh18root0:00ps-ef
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ń.
Pracujesz w firmie zajmującej się cyberbezpieczeństwem? Chcesz zobaczyć reklamę swojej firmy w HackTricks? A może chcesz mieć dostęp do najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF? Sprawdź PLAN SUBSKRYPCJI!