nf_tables est le framework netfilter moderne pour les règles de pare-feu, géré via l'API netlink nft. Il a été une source abondante de vulnérabilités noyau, typiquement des bugs use-after-free ou de confusion de type dans la façon dont les éléments de set, les chaînes et les expressions sont alloués, référencés et libérés. La raison pour laquelle ils comptent pour les conteneurs est l'accessibilité : configurer nf_tables nécessite CAP_NET_ADMIN, et un processus non privilégié qui crée un nouveau user namespace (unshare -Un) reçoit CAP_NET_ADMIN au sein du network namespace qu'il crée ensuite. Un conteneur autorisé à créer des user namespaces peut donc atteindre le code vulnérable même sans aucun privilège sur l'hôte.
Vérifiez l'accessibilité :
uname -r # version gates which nf_tables bug applies
unshare -Urn sh -c 'echo in userns+netns; nft list ruleset' 2>&1 | head
sysctl kernel.unprivileged_userns_clone 2>/dev/null # 1 or unset => userns creation allowed
Schéma d'exploitation#
Le déclencheur précis diffère selon le bug, mais la forme est constante :
# 1. Enter a new user + network namespace to obtain CAP_NET_ADMIN over nf_tables
unshare -Urn /bin/sh
# 2. From a C exploit: build an nft batch that drives the vulnerable path, e.g.
# create a set/chain, trigger the premature free, then reallocate the freed
# object with attacker-controlled data (heap spray via nft objects or msg_msg)
# 3. Use the resulting UAF to gain a controlled kernel write primitive
# 4. Escalate: overwrite modprobe_path or a cred structure, or build arbitrary R/W
Une escalade courante après l'obtention d'une écriture noyau consiste à écraser modprobe_path de sorte que déclencher un chargement automatique exécute un binaire de l'attaquant en tant que root, ou à localiser et mettre à zéro les champs UID de la structure de credentials du processus courant.
Notes d'exploitation#
- Le contrôle déterminant est la création de user namespace. Les hôtes qui positionnent
kernel.unprivileged_userns_clone=0, ou les runtimes qui bloquent les flags user-namespace deunshare/clonevia seccomp, coupent l'accessibilité même sur un noyau vulnérable. - Ces bugs donnent une primitive noyau, pas une commande en un coup ; un exploit fonctionnel inclut une étape de heap-grooming et de contournement du KASLR spécifique à la build du noyau, ils sont donc sensibles à la version.
- Lorsque le profil seccomp par défaut est en vigueur, il bloque déjà
unshareavec le flag user-namespace pour de nombreuses configurations ; confirmez avec ununshare -Un truejetable avant de compter sur cette voie.