Docker --privileged

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Was beeinflusst wird

Wenn Sie einen Container als privilegiert ausführen, werden die folgenden Schutzmaßnahmen deaktiviert:

Mounten von /dev

In einem privilegierten Container können alle Geräte in /dev/ zugegriffen werden. Dadurch können Sie durch Mounten der Festplatte des Hosts ausbrechen.

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

Schreibgeschützte Kernel-Dateisysteme

Kernel-Dateisysteme bieten einen Mechanismus, um das Verhalten des Kernels zu ändern. Wenn es jedoch um Container-Prozesse geht, möchten wir verhindern, dass sie Änderungen am Kernel vornehmen. Daher mounten wir Kernel-Dateisysteme als schreibgeschützt innerhalb des Containers, um sicherzustellen, dass die Container-Prozesse den Kernel nicht ändern können.

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

Maskierung über Kernel-Dateisysteme

Das /proc-Dateisystem ist selektiv beschreibbar, aber aus Sicherheitsgründen sind bestimmte Teile vor Schreib- und Lesezugriffen geschützt, indem sie mit tmpfs überlagert werden, um sicherzustellen, dass Container-Prozesse nicht auf sensible Bereiche zugreifen können.

tmpfs ist ein Dateisystem, das alle Dateien im virtuellen Speicher speichert. tmpfs erstellt keine Dateien auf Ihrer Festplatte. Wenn Sie ein tmpfs-Dateisystem aushängen, gehen alle darin befindlichen Dateien für immer verloren.

# 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-Fähigkeiten

Container-Engines starten Container standardmäßig mit einer begrenzten Anzahl von Fähigkeiten, um zu kontrollieren, was innerhalb des Containers passiert. Privilegierte Container haben alle Fähigkeiten zugänglich. Um mehr über Fähigkeiten zu erfahren, lesen Sie:

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

Sie können die für einen Container verfügbaren Fähigkeiten manipulieren, ohne im --privileged-Modus zu laufen, indem Sie die Flags --cap-add und --cap-drop verwenden.

Seccomp

Seccomp ist nützlich, um die Systemaufrufe einzuschränken, die ein Container aufrufen kann. Ein Standard-Seccomp-Profil ist standardmäßig aktiviert, wenn Docker-Container ausgeführt werden, aber im privilegierten Modus ist es deaktiviert. Erfahren Sie hier mehr über Seccomp:

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

Auch beachten Sie, dass wenn Docker (oder andere CRIs) in einem Kubernetes-Cluster verwendet werden, ist der seccomp-Filter standardmäßig deaktiviert.

AppArmor

AppArmor ist eine Kernel-Erweiterung, um Container auf eine begrenzte Anzahl von Ressourcen mit programmspezifischen Profilen einzuschränken. Wenn Sie mit dem --privileged-Flag ausführen, ist dieser Schutz deaktiviert.

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

SELinux

Das Ausführen eines Containers mit dem --privileged-Flag deaktiviert SELinux-Labels, wodurch es das Label des Container-Engines erbt, normalerweise unconfined, was vollen Zugriff ähnlich wie der Container-Engine gewährt. Im rootless-Modus wird container_runtime_t verwendet, während im Root-Modus spc_t angewendet wird.

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

Was nicht beeinflusst wird

Namespaces

Namespaces werden NICHT von dem --privileged Flag beeinflusst. Obwohl sie keine Sicherheitsbeschränkungen aktiviert haben, sehen sie zum Beispiel nicht alle Prozesse im System oder im Host-Netzwerk. Benutzer können einzelne Namespaces deaktivieren, indem sie die Container-Engine-Flags --pid=host, --net=host, --ipc=host, --uts=host verwenden.

# docker run --rm --privileged -it alpine sh
ps -ef
PID   USER     TIME  COMMAND
1 root      0:00 sh
18 root      0:00 ps -ef

Benutzernamensraum

Standardmäßig verwenden Container-Engines keinen Benutzernamensraum, außer für rootless Container, die sie für das Einhängen des Dateisystems und die Verwendung mehrerer Benutzer-IDs benötigen. Benutzernamensräume, die für rootless Container unerlässlich sind, können nicht deaktiviert werden und verbessern die Sicherheit erheblich, indem sie Privilegien einschränken.

Referenzen

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Last updated