
Ein Write-up und LPE-PoC einer OOB-Read-und-Write-Schwachstelle im Linux-Kernel.
Ein Write-up und Proof-of-Concept zur lokalen Privilegienausweitung einer OOB-Lese- und Schreib-Schwachstelle im Linux-Kernel.
Du kannst das Write-up dieser Schwachstelle auf meinem Blog finden, und du findest auch meine Einführung in nf_tables hier.
Der in diesem Repository bereitgestellte Exploit sollte nicht unbedingt erwarten, ohne Weiteres auf verwundbaren Kernel-Versionen zu funktionieren. Es gibt viele Offsets, die sich zwischen Kernel-Builds unterscheiden, sowie natürlich unterschiedliche ROP-Gadgets.
Manchmal muss sogar die Art und Weise, wie die Schwachstelle ausgenutzt wird, aufgrund von Unterschieden zwischen Kernel-Builds geändert werden. Ein Beispiel ist ein weiteres Write-up dieser Schwachstelle von David Bouman (@pqlqpql), das du hier findest, wo er die Schwachstelle mithilfe von UDP-Paketen ausnutzt – indem er den Stack angreift, wenn ein UDP-Paket verarbeitet wird –, was bei meinem Kernel-Build aufgrund erheblicher Unterschiede im Stack-Layout nicht möglich gewesen wäre. Stattdessen habe ich eine Methode verwendet, die den Stack angreift, wenn ein TCP-ACK-Paket verarbeitet wird.
Wenn du es bei dir testen möchtest, empfehle ich dir, mein Write-up zu lesen und den Weg zu gehen, die Offsets herauszufinden, welche Hooks man verwendet usw.
Die genaue Kernel-Version, aus der ich den Kernel erstellt habe, den ich im Write-up angegriffen habe, war 5.12.0, Commit 9f4ad9e425a1d3b6a34617b8ea226d56a119a717.
Zum Erstellen des Exploits benötigst du die Bibliotheken libmnl und libnftnl sowie die POSIX-Thread-Bibliothek (pthread).
Das Erstellen ist dann so einfach wie
gcc -lmnl -lnftnl -lpthread exploit.c -o exploit
Die Schwachstelle entsteht durch nft_validate_register_store, das in Commit 345023b0db315648ccc3c1a36aee88304a8b4d91 in Version 5.12 eingeführt wurde, und wird in Commit 6e1acfa387b9ff82cfc7db8cc3b6959221a95851 in Version 5.17 behoben.
Dieses Proof-of-Concept und das Write-up der Schwachstelle dienen nur zu Bildungszwecken. Ich bin nicht rechtlich verantwortlich dafür, wie dieser Code verwendet wird.