
Probe Go che riproduce il bug di checksum-offload IPv4 di Linux PwnEscape su un TAP preparato, iniettando header virtio costruiti ad hoc e verificando la copia fuori dai limiti dell'header del frammento.
Sonda Go per il bug di checksum-offload IPv4 di Linux noto come PwnEscape. Si collega a un TAP già preparato e verifica se il frammentatore dell'host si fida di un header IPv4 riscritto da skb_checksum_help.
La sonda gestisce l'iniezione e la cattura dei pacchetti. scripts/setup.sh prepara le interfacce di laboratorio, le impostazioni sysctl e la regola nftables all'interno del network namespace pwnesc. scripts/teardown.sh rimuove il laboratorio.
Su un kernel che completa ancora un checksum parziale prima di leggere ihl (riprodotto qui su 6.18.54; corretto in 6.18.57):
csum_start=22 viene accettato. Vengono poi rimossi due tag VID-0 (14+4+4), quindi la scrittura del checksum finisce sul byte version/IHL dell'IPv4.0x45 a 0x4f. Il frammentatore usa un header di 60 byte.-head 8, la testa lineare è di 28 byte, quindi la copia dell'header di 60 byte legge 32 byte oltre skb_headlen nelle opzioni IPv4 dei frammenti di output.Questo esercita la primitiva di divulgazione descritta nel write-up PwnEscape di PWN.AI. Con CONFIG_INIT_ON_ALLOC_DEFAULT_ON, il tailroom fresco dello slab può apparire come zeri nei byte copiati.
ihlip, nft, sysctlnf_conntrack e nf_defrag_ipv4 integrati o caricabili/dev/net/tunDalla directory del repository sull'host:
go build -o poc .
sudo ./scripts/setup.sh
sudo ip netns exec pwnesc ./poc
La sonda apre pwntap con IFF_TAP|IFF_NO_PI|IFF_VNET_HDR e cattura l'output su pwnv1. Riserva pwntap alla sonda. La regola nftables ct attiva la deframmentazione di conntrack, e pwnv0 usa MTU 200 per frammentare nuovamente il datagramma riassemblato in uscita.
Un controllo dell'header riuscito stampa verify: first byte 0x4f ihl=15. La sonda riporta quindi i frammenti di output, le loro opzioni IPv4 e i byte copiati oltre la testa lineare.
-head (predefinito 8): payload del frammento a offset 0 in byte; un multiplo di 8 da 8 a 40. La copia attesa oltre la testa lineare è di 40 - head byte.-rest (predefinito 400): payload del frammento completante in byte; almeno 16.-spray (predefinito 0): numero di frame della stessa dimensione allocati immediatamente prima del frammento a offset 0.-spray-fill (predefinito 0xee): byte usato per riempire quei frame.-page: usa una testa page_frag, la cui coda può contenere metadati skb. Il valore predefinito è una testa slab.-skip-verify: passa direttamente al controllo del datagramma frammentato.PWN_TAP seleziona l'interfaccia TAP (predefinita pwntap). PWN_CAP seleziona l'interfaccia di cattura (predefinita pwnv1). Lo script di setup usa questi nomi predefiniti.
Dopo che la sonda ha terminato, esci da eventuali shell in pwnesc ed esegui dall'host:
sudo ./scripts/teardown.sh
Questo elimina pwnesc insieme alle sue interfacce, alla tabella nftables ip pwn e alle impostazioni sysctl locali al namespace.