
Sonda em Go que reproduz o bug de checksum-offload IPv4 do Linux PwnEscape em um TAP preparado, injetando cabeçalhos virtio forjados e verificando a cópia fora dos limites do cabeçalho do fragmento.
Sonda em Go para o bug de checksum-offload IPv4 do Linux conhecido como PwnEscape. Ela se conecta a um TAP que você já preparou e verifica se o fragmentador do host confia em um cabeçalho IPv4 reescrito por skb_checksum_help.
A sonda lida com injeção e captura de pacotes. scripts/setup.sh prepara as interfaces do laboratório, as configurações de sysctl e a regra nftables dentro do network namespace pwnesc. scripts/teardown.sh remove o laboratório.
Em um kernel que ainda completa um checksum parcial antes de ler ihl (reproduzido aqui no 6.18.54; corrigido no 6.18.57):
csum_start=22 é aceito. Duas tags VID-0 são então removidas (14+4+4), de modo que a escrita do checksum recai sobre o byte de versão/IHL do IPv4.0x45 para 0x4f. O fragmentador usa um cabeçalho de 60 bytes.-head 8 padrão, a cabeça linear tem 28 bytes, então a cópia do cabeçalho de 60 bytes lê 32 bytes além de skb_headlen, adentrando as opções IPv4 dos fragmentos de saída.Isso exercita a primitiva de divulgação descrita no write-up do PwnEscape da PWN.AI. Com CONFIG_INIT_ON_ALLOC_DEFAULT_ON, o tailroom novo do slab pode aparecer como zeros nos bytes copiados.
ihlip, nft, sysctlnf_conntrack e nf_defrag_ipv4 embutidos ou carregáveis/dev/net/tunA partir do diretório do repositório no host:
go build -o poc .
sudo ./scripts/setup.sh
sudo ip netns exec pwnesc ./poc
A sonda abre pwntap com IFF_TAP|IFF_NO_PI|IFF_VNET_HDR e captura a saída em pwnv1. Reserve pwntap para a sonda. A regra ct do nftables ativa a desfragmentação do conntrack, e pwnv0 usa MTU 200 para fragmentar novamente o datagrama remontado na saída.
Uma verificação de cabeçalho bem-sucedida imprime verify: first byte 0x4f ihl=15. A sonda então relata os fragmentos de saída, suas opções IPv4 e os bytes copiados além da cabeça linear.
-head (padrão 8): payload do fragmento de offset 0 em bytes; um múltiplo de 8 de 8 até 40. A cópia esperada além da cabeça linear é de 40 - head bytes.-rest (padrão 400): payload do fragmento de conclusão em bytes; pelo menos 16.-spray (padrão 0): número de frames do mesmo tamanho alocados imediatamente antes do fragmento de offset 0.-spray-fill (padrão 0xee): byte usado para preencher esses frames.-page: usa uma cabeça page_frag, cujo tail pode conter metadados de skb. O padrão é uma cabeça de slab.-skip-verify: vai diretamente para a verificação do datagrama fragmentado.PWN_TAP seleciona a interface TAP (padrão pwntap). PWN_CAP seleciona a interface de captura (padrão pwnv1). O script de configuração usa esses nomes padrão.
Depois que a sonda terminar, saia de quaisquer shells em pwnesc e execute a partir do host:
sudo ./scripts/teardown.sh
Isso exclui pwnesc junto com suas interfaces, a tabela nftables ip pwn e as configurações de sysctl locais do namespace.