flawopen.com/Teardowns/cve-2024-1086-linux-netfilter-nftables-uaf
CVE-2024-1086 : use-after-free de Linux nf_tables
CVE-2024-1086 est un use-after-free de nf_tables causé par des paramètres DROP invalides. Installez le noyau corrigé de votre distribution.
Imaginez un formulaire où un agent ne peut choisir que « accepter » ou « rejeter ». Un champ séparé contient le code d’erreur du rejet et n’admet que zéro ou un errno négatif valide. Le validateur vulnérable a laissé la valeur positive « accepter » entrer dans ce champ. Le code réseau interprétait alors le verdict de façon incohérente. Le correctif ferme cette entrée en n’acceptant que les verdicts exacts prévus.
Concepts Clés et Termes
nf_tables- Sous-système du noyau Linux utilisé par nftables pour configurer le filtrage des paquets et les règles réseau associées.
Verdict Netfilter- Résultat de l’évaluation d’une règle de paquet, par exemple
NF_ACCEPTouNF_DROP. Un verdict DROP peut porter une erreur que le hook attend sous la forme zéro ou d’un errno négatif valide. Use-after-free (CWE-416)- Défaut mémoire où le code accède à un objet après la fin de sa durée de vie. NVD décrit ici une élévation locale de privilèges du noyau.
User namespace- Namespace Linux qui mappe les identités et capacités des processus. Sa création sans privilèges dépend de la politique du noyau et de la distribution ; elle ne garantit pas une évasion vers l’hôte.
Correspondances de référentiels
- Référence CWE pour la faiblesse décrite dans ce guide : CWE-416
- CISA KEV — ajouté le 2024-05-30 — CVE-2024-1086
Analyse de Cause Racine
Dans net/netfilter/nf_tables_api.c, nft_verdict_init() masquait auparavant la valeur du verdict et acceptait des paramètres pour NF_DROP ou NF_QUEUE. Le hook Netfilter attend que les bits supérieurs de NF_DROP contiennent zéro ou un errno négatif valide. Le correctif upstream indique qu’une valeur positive telle que NF_ACCEPT pouvait provoquer un use-after-free. Le patch supprime ce chemin permissif et n’accepte que les verdicts exacts ; toute autre valeur renvoie -EINVAL. NVD décrit un impact d’élévation locale de privilèges. L’exploitabilité dépend du noyau, des capacités accessibles et de la politique de la distribution ; ne supposez pas que chaque conteneur présente le même risque.
Déroulement de l'Attaque Étape par Étape
Capacité locale à gérer les règles
L’attaque documentée est locale. Le processus doit pouvoir atteindre la validation des verdicts nf_tables ; les capacités requises et l’activation des user namespaces non privilégiés dépendent de la configuration de l’hôte.
Un paramètre de verdict invalide atteint la validation
Avant le correctif, nft_verdict_init() acceptait certaines valeurs paramétrées après application de NF_VERDICT_MASK, notamment une valeur positive telle que NF_ACCEPT dans les bits du paramètre.
Le hook atteint le use-after-free
Le hook Netfilter interprète les paramètres NF_DROP comme zéro ou un errno négatif valide. Le rapport upstream indique que la valeur positive acceptée peut provoquer un use-after-free pendant le traitement des paquets ; le patch ne décrit ni primitive universelle ni sortie de conteneur garantie.
Installer le noyau corrigé de la distribution
Le changement upstream rejette les paramètres de verdict non pris en charge. Installez et démarrez le noyau corrigé fourni par votre distribution, car les versions de paquets et les rétroportages varient.
Code Source : Vulnérable vs Sécurisé
Le code vulnérable masquait le verdict puis poursuivait, ce qui acceptait des valeurs paramétrées comme NF_ACCEPT positif dans le champ d’erreur de NF_DROP. Le correctif n’admet que les constantes exactes et renvoie -EINVAL pour toute autre valeur. Il s’agit d’extraits ciblés du patch upstream, pas de fonctions autonomes compilables.
Extrait source: net/netfilter/nf_tables_api.c
/* Extrait de nft_verdict_init() dans net/netfilter/nf_tables_api.c, avant f342de4e2f33.
* Le chemin avec valeur masquée acceptait les verdicts paramétrés. */
switch (data->verdict.code) {
default:
switch (data->verdict.code & NF_VERDICT_MASK) {
case NF_ACCEPT:
case NF_DROP:
case NF_QUEUE:
break;
default:
return -EINVAL;
}
fallthrough;
case NFT_CONTINUE:
case NFT_BREAK:
case NFT_RETURN:
/* Le traitement des autres verdicts existants se poursuit. */
break;
}
/* Extrait de nft_verdict_init() dans net/netfilter/nf_tables_api.c,
* tel que modifié par f342de4e2f33. */
switch (data->verdict.code) {
case NF_ACCEPT:
case NF_DROP:
case NF_QUEUE:
break;
case NFT_CONTINUE:
case NFT_BREAK:
case NFT_RETURN:
/* Le traitement des autres verdicts existants se poursuit. */
break;
default:
return -EINVAL;
}
Liste de Contrôle de Sécurité pour l'Ingénierie
- ✓Installez et démarrez le paquet de noyau corrigé recommandé par votre distribution ; vérifiez le noyau actif après redémarrage, car les rétroportages modifient les numéros de version.
- ✓Consultez le suivi de sécurité de votre distribution pour la variante et le paquet exacts au lieu de vous fier à une comparaison unique avec les versions upstream.
- ✓Si le correctif doit attendre, évaluez l’option documentée par le fournisseur pour limiter la création de user namespaces non privilégiés ; vérifiez sa disponibilité et testez ses effets sur les conteneurs et les applications de bureau.
- ✓Lors de la revue de la validation des verdicts du noyau, rejetez les bits de paramètre non pris en charge avant le chemin du hook et testez les constantes admises ainsi que les valeurs positives invalides.