Docker --privileged
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Qué Afecta
Cuando ejecutas un contenedor como privilegiado, estas son las protecciones que estás deshabilitando:
Montar /dev
En un contenedor privilegiado, todos los dispositivos pueden ser accedidos en /dev/
. Por lo tanto, puedes escapar al montar el disco del host.
# docker run --rm -it alpine sh
ls /dev
console fd mqueue ptmx random stderr stdout urandom
core full null pts shm stdin tty zero
Sistemas de archivos del kernel de solo lectura
Los sistemas de archivos del kernel proporcionan un mecanismo para que un proceso modifique el comportamiento del kernel. Sin embargo, cuando se trata de procesos de contenedor, queremos evitar que realicen cambios en el kernel. Por lo tanto, montamos los sistemas de archivos del kernel como solo lectura dentro del contenedor, asegurando que los procesos del contenedor no puedan modificar el 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)
Enmascaramiento sobre sistemas de archivos del kernel
El sistema de archivos /proc es selectivamente escribible, pero por razones de seguridad, ciertas partes están protegidas del acceso de escritura y lectura al superponerse con tmpfs, asegurando que los procesos del contenedor no puedan acceder a áreas sensibles.
[!NOTE] > tmpfs es un sistema de archivos que almacena todos los archivos en memoria virtual. tmpfs no crea ningún archivo en tu disco duro. Así que si desmontas un sistema de archivos tmpfs, todos los archivos que residen en él se pierden para siempre.
# 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)
Capacidades de Linux
Los motores de contenedores lanzan los contenedores con un número limitado de capacidades para controlar lo que sucede dentro del contenedor por defecto. Los privilegiados tienen todas las capacidades accesibles. Para aprender sobre capacidades, lee:
# 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
[...]
Puedes manipular las capacidades disponibles para un contenedor sin ejecutar en modo --privileged
utilizando las banderas --cap-add
y --cap-drop
.
Seccomp
Seccomp es útil para limitar las syscalls que un contenedor puede llamar. Un perfil de seccomp predeterminado está habilitado por defecto al ejecutar contenedores de docker, pero en modo privilegiado está deshabilitado. Aprende más sobre Seccomp aquí:
# 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
También, ten en cuenta que cuando se utilizan Docker (u otros CRIs) en un clúster de Kubernetes, el filtro seccomp está deshabilitado por defecto.
AppArmor
AppArmor es una mejora del núcleo para confinar contenedores a un conjunto limitado de recursos con perfiles por programa. Cuando ejecutas con la bandera --privileged
, esta protección está deshabilitada.
# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined
SELinux
Ejecutar un contenedor con la bandera --privileged
desactiva las etiquetas de SELinux, haciendo que herede la etiqueta del motor de contenedores, típicamente unconfined
, otorgando acceso completo similar al del motor de contenedores. En modo sin privilegios, utiliza container_runtime_t
, mientras que en modo root, se aplica spc_t
.
# You can manually disable selinux in docker with
--security-opt label:disable
Lo Que No Afecta
Espacios de Nombres
Los espacios de nombres NO se ven afectados por la bandera --privileged
. A pesar de que no tienen las restricciones de seguridad habilitadas, no ven todos los procesos en el sistema o la red del host, por ejemplo. Los usuarios pueden deshabilitar espacios de nombres individuales utilizando las banderas de los motores de contenedores --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
Espacio de nombres de usuario
Por defecto, los motores de contenedores no utilizan espacios de nombres de usuario, excepto para contenedores sin privilegios, que los requieren para el montaje del sistema de archivos y el uso de múltiples UIDs. Los espacios de nombres de usuario, integrales para contenedores sin privilegios, no se pueden desactivar y mejoran significativamente la seguridad al restringir privilegios.
Referencias
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.