FlawOpen

flawopen.com/Teardowns/cve-2024-1086-linux-netfilter-nftables-uaf

● CVE-2024-1086 · CVSS 7.8 · Haute
Recherche · FlawOpen

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.

💡 Explication en Langage Simple (ELI5)

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_ACCEPT ou NF_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

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

Étape 1

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.

Étape 2

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.

Étape 3

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.

Étape 4

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

IMPLÉMENTATION VULNÉRABLE
/* 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;
}
PATCH SÉCURISÉ ET ROBUSTE
/* 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

Sources