
Go-Sonde, die den Linux-IPv4-Checksum-Offload-Bug PwnEscape auf einem vorbereiteten TAP reproduziert, präparierte virtio-Header injiziert und die Out-of-Bounds-Kopie des Fragment-Headers verifiziert.
Go-Probe für den Linux-IPv4-Checksum-Offload-Bug namens PwnEscape. Sie hängt sich an ein bereits vorbereitetes TAP an und prüft, ob der Host-Fragmentierer einem durch skb_checksum_help umgeschriebenen IPv4-Header vertraut.
Die Probe übernimmt Paketinjektion und -erfassung. scripts/setup.sh bereitet die Lab-Schnittstellen, sysctl-Einstellungen und die nftables-Regel innerhalb des Netzwerk-Namespace pwnesc vor. scripts/teardown.sh entfernt das Lab.
Auf einem Kernel, der noch eine partielle Prüfsumme vervollständigt, bevor ihl gelesen wird (hier auf 6.18.54 reproduziert; behoben in 6.18.57):
csum_start=22 wird akzeptiert. Anschließend werden zwei VID-0-Tags entfernt (14+4+4), sodass der Prüfsummen-Schreibvorgang auf dem IPv4-Version/IHL-Byte landet.0x45 zu 0x4f. Der Fragmentierer verwendet einen 60-Byte-Header.-head 8 beträgt der lineare Head 28 Bytes, sodass die 60-Byte-Header-Kopie 32 Bytes über skb_headlen hinaus in die IPv4-Optionen der Ausgabefragmente liest.Dies übt das Offenlegungs-Primitiv aus, das in PWN.AIs PwnEscape-Artikel beschrieben wird. Mit CONFIG_INIT_ON_ALLOC_DEFAULT_ON kann frischer Slab-Tailroom in den kopierten Bytes als Nullen erscheinen.
ihl gelesen wirdip, nft, sysctlnf_conntrack und nf_defrag_ipv4/dev/net/tunAus dem Repository-Verzeichnis auf dem Host:
go build -o poc .
sudo ./scripts/setup.sh
sudo ip netns exec pwnesc ./poc
Die Probe öffnet pwntap mit IFF_TAP|IFF_NO_PI|IFF_VNET_HDR und erfasst die Ausgabe auf pwnv1. Reservieren Sie pwntap für die Probe. Die nftables-Regel ct aktiviert die Conntrack-Defragmentierung, und pwnv0 verwendet MTU 200, um das reassemblierte Datagramm bei der Ausgabe erneut zu fragmentieren.
Eine erfolgreiche Header-Prüfung gibt verify: first byte 0x4f ihl=15 aus. Die Probe meldet dann die Ausgabefragmente, ihre IPv4-Optionen und die über den linearen Head hinaus kopierten Bytes.
-head (Standard 8): Nutzlast des Offset-0-Fragments in Bytes; ein Vielfaches von 8 von 8 bis 40. Die erwartete Kopie über den linearen Head hinaus beträgt 40 - head Bytes.-rest (Standard 400): Nutzlast des vervollständigenden Fragments in Bytes; mindestens 16.-spray (Standard 0): Anzahl gleich großer Frames, die unmittelbar vor dem Offset-0-Fragment alloziert werden.-spray-fill (Standard 0xee): Byte, mit dem diese Frames gefüllt werden.-page: verwendet einen page_frag-Head, dessen Tail skb-Metadaten enthalten kann. Der Standard ist ein Slab-Head.-skip-verify: direkt zur Prüfung des fragmentierten Datagramms springen.PWN_TAP wählt die TAP-Schnittstelle (Standard pwntap). PWN_CAP wählt die Erfassungsschnittstelle (Standard pwnv1). Das Setup-Skript verwendet diese Standardnamen.
Nachdem die Probe beendet ist, verlassen Sie alle Shells in pwnesc und führen Sie vom Host aus aus:
sudo ./scripts/teardown.sh
Dies löscht pwnesc zusammen mit seinen Schnittstellen, der nftables-Tabelle ip pwn und den namespace-lokalen sysctl-Einstellungen.