
Sonde Go qui reproduit le bug de déchargement de checksum IPv4 sous Linux PwnEscape sur un TAP préparé, en injectant des en-têtes virtio forgés et en vérifiant la copie hors limites de l'en-tête de fragment.
Sonde Go pour le bug de déport de somme de contrôle IPv4 sous Linux connu sous le nom de PwnEscape. Elle s'attache à un TAP que vous avez déjà préparé et vérifie si le fragmenteur de l'hôte fait confiance à un en-tête IPv4 réécrit par skb_checksum_help.
La sonde gère l'injection et la capture de paquets. scripts/setup.sh prépare les interfaces du laboratoire, les paramètres sysctl et la règle nftables à l'intérieur du namespace réseau pwnesc. scripts/teardown.sh supprime le laboratoire.
Sur un noyau qui complète encore une somme de contrôle partielle avant de lire ihl (reproduit ici sur 6.18.54 ; corrigé dans 6.18.57) :
csum_start=22 est accepté. Deux balises VID-0 sont ensuite retirées (14+4+4), de sorte que l'écriture de la somme de contrôle atterrit sur l'octet version/IHL de l'IPv4.0x45 à 0x4f. Le fragmenteur utilise un en-tête de 60 octets.-head 8, la tête linéaire fait 28 octets, de sorte que la copie de l'en-tête de 60 octets lit 32 octets au-delà de skb_headlen dans les options IPv4 des fragments de sortie.Cela exerce la primitive de divulgation décrite dans l'article PwnEscape de PWN.AI. Avec CONFIG_INIT_ON_ALLOC_DEFAULT_ON, l'espace libre en queue de slab fraîchement alloué peut apparaître comme des zéros dans les octets copiés.
ihlip, nft, sysctlnf_conntrack et nf_defrag_ipv4 intégrés ou chargeables/dev/net/tunDepuis le répertoire du dépôt sur l'hôte :
go build -o poc .
sudo ./scripts/setup.sh
sudo ip netns exec pwnesc ./poc
La sonde ouvre pwntap avec IFF_TAP|IFF_NO_PI|IFF_VNET_HDR et capture la sortie sur pwnv1. Réservez pwntap à la sonde. La règle nftables ct active la défragmentation conntrack, et pwnv0 utilise une MTU de 200 pour fragmenter à nouveau le datagramme réassemblé en sortie.
Une vérification d'en-tête réussie affiche verify: first byte 0x4f ihl=15. La sonde rapporte ensuite les fragments de sortie, leurs options IPv4 et les octets copiés au-delà de la tête linéaire.
-head (par défaut 8) : charge utile du fragment à l'offset 0 en octets ; un multiple de 8 de 8 à 40. La copie attendue au-delà de la tête linéaire est de 40 - head octets.-rest (par défaut 400) : charge utile du fragment de complétion en octets ; au moins 16.-spray (par défaut 0) : nombre de trames de même taille allouées immédiatement avant le fragment à l'offset 0.-spray-fill (par défaut 0xee) : octet utilisé pour remplir ces trames.-page : utiliser une tête page_frag, dont la queue peut contenir des métadonnées skb. Par défaut, il s'agit d'une tête slab.-skip-verify : passer directement à la vérification du datagramme fragmenté.PWN_TAP sélectionne l'interface TAP (par défaut pwntap). PWN_CAP sélectionne l'interface de capture (par défaut pwnv1). Le script de configuration utilise ces noms par défaut.
Une fois la sonde terminée, quittez tout shell dans pwnesc et exécutez depuis l'hôte :
sudo ./scripts/teardown.sh
Cela supprime pwnesc ainsi que ses interfaces, la table nftables ip pwn et les paramètres sysctl locaux au namespace.