Docker --privileged

Support HackTricks

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

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 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 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:

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

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í:

Seccomp
# 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 Docker (u otros CRIs) se utilizan en un Kubernetes cluster, el filtro seccomp está deshabilitado por defecto.

AppArmor

AppArmor es una mejora del kernel para confinar contenedores a un conjunto limitado de recursos con perfiles por programa. Cuando ejecutas con la bandera --privileged, esta protección está deshabilitada.

AppArmor
# 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 root, utiliza container_runtime_t, mientras que en modo root, se aplica spc_t.

SELinux
# 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 motores de contenedor --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

Support HackTricks

Last updated