FlawOpen

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

● CVE-2024-1086 · CVSS 7.8 · Hoch
Sicherheitsforschung · FlawOpen

CVE-2024-1086: Use-after-free in Linux nf_tables

CVE-2024-1086: Use-after-free in Linux nf_tables durch ungültige DROP-Parameter. Installieren Sie den korrigierten Kernel Ihrer Distribution.

💡 Einfache Erklärung (ELI5)

Stellen Sie sich ein Formular vor, auf dem ein Sachbearbeiter nur „annehmen“ oder „verwerfen“ auswählen darf. Ein separates Feld enthält den Fehlercode für das Verwerfen und erlaubt nur null oder einen gültigen negativen Fehlercode. Die verwundbare Prüfung ließ den positiven Wert „annehmen“ in dieses Feld gelangen. Der Netzwerkcode deutete das Urteil anschließend uneinheitlich. Der Patch schließt diese Lücke und akzeptiert nur die exakt vorgesehenen Urteile.

Kernkonzepte & Begriffe

nf_tables
Linux-Kernel-Subsystem, das nftables zum Einrichten der Paketfilterung und zugehöriger Netzwerkregeln verwendet.
Netfilter-Urteil
Ergebnis der Auswertung einer Paketregel, etwa NF_ACCEPT oder NF_DROP. Ein DROP-Urteil kann einen Fehlerwert enthalten, den der Hook als null oder gültigen negativen errno-Wert erwartet.
Use-after-free (CWE-416)
Speicherfehler, bei dem Code nach dem Ende der Objektlebensdauer erneut auf das Objekt zugreift. NVD führt hier eine lokale Rechteausweitung im Kernel auf.
User-Namespace
Linux-Namespace zur Abbildung von Prozessidentitäten und -fähigkeiten. Ob unprivilegierte Benutzer ihn erstellen dürfen, hängt von Kernel- und Distributionsrichtlinien ab; daraus folgt nicht automatisch ein Host-Ausbruch.

Framework-Zuordnungen

Ursachenanalyse

In net/netfilter/nf_tables_api.c maskierte nft_verdict_init() den Urteilswert zuvor und akzeptierte Parameter für NF_DROP oder NF_QUEUE. Der Netfilter-Hook erwartet in den oberen Bits eines NF_DROP-Urteils null oder einen gültigen negativen errno-Wert. Laut Upstream-Fix konnte ein positiver Wert wie NF_ACCEPT dadurch einen Use-after-free auslösen. Der Patch entfernt den permissiven Pfad und lässt nur die exakten unterstützten Urteile zu; ungültige Werte liefern -EINVAL. NVD nennt lokale Rechteausweitung als Auswirkung. Die Erreichbarkeit hängt von Kernel, verfügbaren Fähigkeiten und Distributionsrichtlinien ab; nicht jede Containerkonfiguration ist automatisch gleich betroffen.

Schritt-für-Schritt Angriffsablauf

Schritt 1

Lokale Fähigkeit zur Regelverwaltung

Der dokumentierte Angriff ist lokal. Der Prozess muss die nf_tables-Urteilsprüfung erreichen können; erforderliche Fähigkeiten und nicht privilegierte User-Namespaces hängen von der Hostkonfiguration ab.

Schritt 2

Ungültiger Urteilsparameter erreicht die Prüfung

Vor dem Fix akzeptierte nft_verdict_init() bestimmte parametrisierte Werte nach Anwendung von NF_VERDICT_MASK, darunter einen positiven Wert wie NF_ACCEPT in den Parameterbits.

Schritt 3

Der Hook erreicht den Use-after-free

Der Netfilter-Hook interpretiert NF_DROP-Parameter als null oder gültigen negativen errno-Wert. Der Upstream-Bericht sagt, dass der akzeptierte positive Wert beim Paketverarbeiten einen Use-after-free verursachen kann; der Patch belegt weder ein universelles Exploit-Primitive noch einen garantierten Container-Ausbruch.

Schritt 4

Korrigierten Distributionskernel installieren

Die Upstream-Änderung weist nicht unterstützte Urteilsparameter zurück. Installieren und starten Sie den von Ihrer Distribution bereitgestellten Fix-Kernel, da Paketversionen und Backports abweichen.

Quellcode: Verwundbar vs. Sicher

Der verwundbare Code maskierte den Urteilswert und ließ die Verarbeitung weiterlaufen. Dadurch konnte etwa NF_ACCEPT als positiver Parameter im Fehlerfeld von NF_DROP akzeptiert werden. Der Fix erlaubt nur exakte Konstanten und liefert für andere Werte -EINVAL. Dies sind gezielte Auszüge des Upstream-Patches, keine eigenständigen kompilierbaren Funktionen.

Quelltextauszug: net/netfilter/nf_tables_api.c

VERWUNDBARE IMPLEMENTIERUNG
/* Auszug aus nft_verdict_init() in net/netfilter/nf_tables_api.c vor f342de4e2f33.
 * Der Pfad mit maskiertem Wert akzeptierte parametrisierte Verdicts. */
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:
    /* Die Behandlung der übrigen vorhandenen Verdicts folgt. */
    break;
}
GEHÄRTETER SICHERHEITS-PATCH
/* Auszug aus nft_verdict_init() in net/netfilter/nf_tables_api.c,
 * geändert durch f342de4e2f33. */
switch (data->verdict.code) {
case NF_ACCEPT:
case NF_DROP:
case NF_QUEUE:
    break;
case NFT_CONTINUE:
case NFT_BREAK:
case NFT_RETURN:
    /* Die Behandlung der übrigen vorhandenen Verdicts folgt. */
    break;
default:
    return -EINVAL;
}

Checkliste für Engineering & Systemsicherheit

Quellen