
Uma implementação em Go de dirtyfrag (CVE-2026-43284 / CVE-2026-43500)
Dois bugs. Um shell. Nenhuma escrita em disco.
Portabilidade em Go do dirtyfrag (CVE-2026-43284 / CVE-2026-43500).
A classe dos bugs está no subsistema XFRM do kernel Linux. Quando uma página de arquivo é splice()ada em um pipe e depois em um socket criptografado com ESP, o kernel descriptografa o payload ESP in-place – diretamente na página de cache de páginas (page cache) do arquivo de origem. O arquivo é somente leitura. O cache de páginas não é.
dirtyfrag encadeia dois bugs independentes que exploram essa primitiva:
CVE-2026-43284 – Caminho ESP/XFRM
Instala 48 SAs (Associações de Segurança) do XFRM em modo transporte via NETLINK_XFRM. Cada SA codifica 4 bytes de payload de shellcode no campo seq_hi de seu estado de replay ESN. Uma cadeia vmsplice + splice dispara a descriptografia ESP in-place para cada SA, escrevendo esses 4 bytes na entrada de cache de páginas de /usr/bin/su. 48 disparos, 192 bytes escritos, sem condição de corrida.
CVE-2026-43500 – Caminho RxRPC/rxkad
Faz força bruta offline em 3 chaves de sessão PCBC(fcrypt) que produzem as sequências de bytes alvo quando descriptografadas. Dispara um gatilho de socket AF_RXRPC para cada chave a fim de corrigir a entrada root em /etc/passwd para root::0:0 (nullok). su - então aceita uma senha vazia.
Ambos os caminhos são executados em um namespace de usuário + rede (CLONE_NEWUSER | CLONE_NEWNET) para evitar a necessidade de CAP_NET_ADMIN no host.
go build -o dirtyfrag-go .
./dirtyfrag-go
# Forçar um caminho específico
./dirtyfrag-go --force-esp
./dirtyfrag-go --force-rxrpc
# Saída verbosa
./dirtyfrag-go -v
O binário tenta o caminho ESP primeiro. Se /usr/bin/su não for corrigido (patched) em seguida, ele recai para o caminho RxRPC (até 3 tentativas). Em caso de sucesso, ele entra em um shell root através de um novo PTY.
O exploit toca apenas o cache de páginas. Os binários em disco e /etc/passwd permanecem intactos. Uma reinicialização restaura tudo. Para remover imediatamente sem reiniciar:
echo 1 | tee /proc/sys/vm/drop_caches
esp4, esp6 (caminho ESP) e/ou rxrpc (caminho RxRPC)Todos os kernels anteriores aos patches:
rmmod esp4 esp6 rxrpc
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
> /etc/modprobe.d/dirtyfrag.conf
O runtime do Go é multi-threaded desde o início, portanto unshare(CLONE_NEWUSER) não é permitido. A portabilidade em Go se auto-re-executa como um processo filho com SysProcAttr.Cloneflags definido, o que chama clone() antes da inicialização do runtime Go.
| C (original) | Go |
|---|
| Dependências externas | nenhuma | nenhuma |
| Arquivo único | não | não |
| Binário estático | sim | sim |
| Caminho RxRPC | sim | sim |
| Caminho ESP | sim | sim |
| Isolamento de namespace | unshare() | re-execução com Cloneflags |