Les conteneurs ne virtualisent pas le noyau ; ils partagent l'unique noyau de l'hôte via les namespaces et les cgroups. Tout chemin de code du noyau qu'un processus conteneurisé peut atteindre constitue donc une surface d'évasion, et un exploit de noyau réussi atterrit directement sur l'hôte en tant que root, contournant tous les namespaces. Ce qu'un conteneur peut atteindre s'élargit énormément lorsqu'il peut créer un user namespace, car cela accorde CAP_NET_ADMIN et d'autres capabilities à l'intérieur du namespace et expose des sous-systèmes (netfilter, certains systèmes de fichiers) autrement inaccessibles.
Évaluez l'accessibilité et la version :
uname -r # exact kernel release
unshare -Urn true 2>/dev/null && echo "unprivileged userns available"
sysctl kernel.unprivileged_userns_clone 2>/dev/null
Sous-thèmes#
- Dirty COW : une race condition copy-on-write pour écrire dans des pages en lecture seule.
- Dirty Pipe : écraser le page cache d'un fichier en lecture seule via un pipe.
- nf_tables : use-after-free de netfilter accessibles via un user namespace non privilégié.