Docker --privileged

Aprende hacking de AWS de cero a héroe con htARTE (Experto en Red de HackTricks AWS)!

Qué afecta

Cuando ejecutas un contenedor como privilegiado, deshabilitas las siguientes protecciones:

Montar /dev

En un contenedor privilegiado, todos los dispositivos pueden ser accedidos en /dev/. Por lo tanto, puedes escapar montando 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
# docker run --rm --privileged -it alpine sh
ls /dev
cachefiles       mapper           port             shm              tty24            tty44            tty7
console          mem              psaux            stderr           tty25            tty45            tty8
core             mqueue           ptmx             stdin            tty26            tty46            tty9
cpu              nbd0             pts              stdout           tty27            tty47            ttyS0
[...]

Sistemas de archivos de kernel de solo lectura

Los sistemas de archivos de kernel proporcionan un mecanismo para que un proceso modifique el comportamiento del kernel. Sin embargo, cuando se trata de procesos de contenedores, queremos evitar que realicen cambios en el kernel. Por lo tanto, montamos los sistemas de archivos de 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)
# docker run --rm --privileged -it alpine sh
mount  | grep '(ro'

Enmascaramiento de sistemas de archivos del kernel

El sistema de archivos /proc es selectivamente escribible pero, por motivos de seguridad, ciertas partes están protegidas del acceso de escritura y lectura al superponerlas con tmpfs, asegurando que los procesos del contenedor no puedan acceder a áreas sensibles.

tmpfs es un sistema de archivos que almacena todos los archivos en la memoria virtual. tmpfs no crea archivos en tu disco duro. Por lo tanto, 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)
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined

También, ten en cuenta que cuando Docker (u otros CRIs) se utilizan en un clúster de Kubernetes, el filtro seccomp está deshabilitado de forma predeterminada

AppArmor

AppArmor es una mejora del kernel para confinar los contenedores a un conjunto limitado de recursos con perfiles por programa. Cuando se ejecuta con la bandera --privileged, esta protección se deshabilita.

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

SELinux

Ejecutar un contenedor con la bandera --privileged deshabilita las etiquetas SELinux, lo que hace que herede la etiqueta del motor de contenedores, típicamente unconfined, otorgando acceso completo similar al del motor de contenedores. En modo sin raíz, se utiliza container_runtime_t, mientras que en modo raíz, se aplica spc_t.

pageSELinux
# 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. Aunque no tengan habilitadas las restricciones de seguridad, 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 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

De forma predeterminada, los motores de contenedores no utilizan espacios de nombres de usuario, excepto para contenedores sin raíz, que los requieren para el montaje del sistema de archivos y el uso de múltiples UID. Los espacios de nombres de usuario, esenciales para los contenedores sin raíz, no se pueden desactivar y mejoran significativamente la seguridad al restringir los privilegios.

Referencias

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Última actualización