flawopen.com/Teardowns/cve-2024-1086-linux-netfilter-nftables-uaf
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.
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_ACCEPToderNF_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
- CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-416
- CISA KEV — aufgenommen am 2024-05-30 — CVE-2024-1086
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
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.
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.
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.
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
/* 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;
}
/* 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
- ✓Installieren und starten Sie das von Ihrer Distribution empfohlene korrigierte Kernelpaket; prüfen Sie nach dem Neustart den laufenden Kernel, da Backports unterschiedliche Versionsnummern verwenden.
- ✓Prüfen Sie den Sicherheitshinweis Ihrer Distribution für Kernelvariante und Paketversion, statt sich auf einen einzigen Upstream-Versionsvergleich zu verlassen.
- ✓Falls sich das Update verzögert, bewerten Sie die vom Anbieter dokumentierte Einschränkung nicht privilegierter User-Namespaces; prüfen Sie die Verfügbarkeit und testen Sie Auswirkungen auf Container und Desktop-Anwendungen.
- ✓Verwerfen Sie bei Prüfungen der Kernel-Urteilsvalidierung nicht unterstützte Parameterbits vor dem Paket-Hook-Pfad und testen Sie erlaubte Konstanten sowie ungültige positive Werte.