Docker --privileged

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)!

Quels sont les impacts

Lorsque vous exécutez un conteneur en mode privilégié, voici les protections que vous désactivez :

Monter /dev

Dans un conteneur privilégié, tous les appareils peuvent être accédés dans /dev/. Par conséquent, vous pouvez échapper en montant le disque de l'hôte.

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

Systèmes de fichiers du noyau en lecture seule

Les systèmes de fichiers du noyau fournissent un mécanisme permettant à un processus de modifier le comportement du noyau. Cependant, en ce qui concerne les processus de conteneurs, nous voulons les empêcher de faire des modifications au noyau. Par conséquent, nous montons les systèmes de fichiers du noyau en lecture seule à l'intérieur du conteneur, garantissant que les processus du conteneur ne peuvent pas modifier le noyau.

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

Masquage des systèmes de fichiers du noyau

Le système de fichiers /proc est sélectivement inscriptible mais, pour des raisons de sécurité, certaines parties sont protégées contre l'écriture et la lecture en les superposant avec tmpfs, garantissant que les processus du conteneur ne peuvent pas accéder à des zones sensibles.

tmpfs est un système de fichiers qui stocke tous les fichiers en mémoire virtuelle. tmpfs ne crée aucun fichier sur votre disque dur. Ainsi, si vous démontez un système de fichiers tmpfs, tous les fichiers qui y résident sont perdus pour toujours.

# 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

Également, notez que lorsque Docker (ou d'autres CRIs) sont utilisés dans un cluster Kubernetes, le filtre seccomp est désactivé par défaut

AppArmor

AppArmor est une amélioration du noyau pour confiner les containers à un **ensemble limité de ressources avec des profils par programme. Lorsque vous exécutez avec le drapeau --privileged, cette protection est désactivée.

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

SELinux

L'exécution d'un conteneur avec le drapeau --privileged désactive les étiquettes SELinux, le faisant hériter de l'étiquette du moteur de conteneurs, généralement unconfined, accordant un accès complet similaire au moteur de conteneurs. En mode sans privilège, il utilise container_runtime_t, tandis qu'en mode root, spc_t est appliqué.

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

Ce qui n'affecte pas

Espaces de noms

Les espaces de noms ne sont PAS affectés par le drapeau --privileged. Même s'ils n'ont pas les contraintes de sécurité activées, ils ne voient pas tous les processus sur le système ou le réseau hôte, par exemple. Les utilisateurs peuvent désactiver des espaces de noms individuels en utilisant les drapeaux des moteurs de conteneurs --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

Espace utilisateur

Par défaut, les moteurs de conteneurs n'utilisent pas les espaces utilisateurs, sauf pour les conteneurs sans privilèges, qui les nécessitent pour le montage du système de fichiers et l'utilisation de plusieurs UID. Les espaces utilisateurs, essentiels pour les conteneurs sans privilèges, ne peuvent pas être désactivés et améliorent considérablement la sécurité en restreignant les privilèges.

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Dernière mise à jour