Web2.5 Kill Chain: blockchain oracle como vetor de Python pickle RCE
Writeup educacional demonstra como um oracle Ethereum pode ser weaponizado para entregar pickle payload RCE ao backend Web2 de infraestrutura crítica — o ledger imutável vira vetor de ataque.
O artigo modela um kill chain em que o atacante escreve bytes maliciosos diretamente na blockchain via transação normal — gas pago, assinatura válida, consenso alcançado. O oracle Python que lê esse estado chama `pickle.loads()` no dado on-chain sem sanitização, executando o payload no servidor Web2 que controla roteamento físico. A ficção é o cenário (Nexus Grid, 4M lares); o vetor é real e replicável hoje.
Contexto
Oracles são o elo Web2↔Web3 mais ignorado em bug bounty: são serviços Python/Node rodando em infraestrutura tradicional que leem estado da blockchain e disparam ações off-chain. Chainlink domina o mercado mas dezenas de protocolos DeFi e projetos IoT/RWA deployam oracles customizados sem hardening. Pickle deserialization em Python é classe de vuln antiga (documentada desde 2011 no Python docs próprio), mas reaparece toda vez que um dev serializa objetos 'pra conveniência' em pipelines de dados.
Mecânica técnica
O oracle lê eventos on-chain (ex: `EventEmitted(bytes data)`) e passa o campo `data` diretamente para `pickle.loads(data)` no backend Python. Como qualquer endereço pode emitir transações para o contrato, o atacante publica um objeto pickled malicioso como payload da transação. O `__reduce__` do objeto instrui o Python a executar `os.system()` ou `subprocess.Popen()` no momento da deserialização. O contrato é imutável e o ledger aceita o dado — nenhum controle on-chain pode filtrar conteúdo arbitrário de bytes. O RCE ocorre no processo do oracle, tipicamente rodando com permissões de serviço em servidor com acesso a APIs internas ou sistemas OT. Variações incluem `pickle` via IPFS hash resolvido pelo oracle, ou via campo de metadados de NFT processado por backend de indexação.
O que a gente tira disso
Programas de RWA (real-world assets), DePIN (decentralized physical infrastructure) e qualquer protocolo que conecte blockchain a sistemas físicos são o sweet spot — poucos hunters olham o backend off-chain, todo mundo foca no contrato. `pickle.loads` em código de oracle é bounty crítico em qualquer programa que pague por RCE: Immunefi paga $50k–$250k+ nessa classe. O pivot óbvio é escalar do RCE no oracle para movimento lateral na infraestrutura interna — SSRF contra metadata endpoints, acesso a chaves privadas do oracle (que controlam os fundos do protocolo), ou pivot para redes OT se o alvo for DePIN.
Como replicar em outros alvos
- Grep em repos de oracle customizado: `grep -r 'pickle.loads\|pickle.load\|yaml.load\|marshal.loads' --include='*.py'`
- Buscar projetos que indexam eventos blockchain em Python: Chainlink node adapters, TheGraph subgraphs com processamento Python, backends de NFT metadata
- Verificar se o campo processado pelo oracle aceita bytes arbitrários on-chain — qualquer `bytes` ou `string` em eventos Solidity é candidato
- Payload de teste seguro: `pickle.dumps({'test': True})` encodado em hex, enviado via `cast send` — se o oracle crashar ou logar erro de deserialização, a superfície existe
- Shodan: `http.title:'oracle' port:8545,8546` + `product:'Flask' country:US` para backends expostos de oracle nodes
Quer virar hunter de verdade? Curso do Ofjaaah.
Metodologia de quem já reportou 3 dígitos de vulnerabilidades em HackerOne, Bugcrowd e Intigriti. Do recon ao report pago — sem teoria inútil.
Ver curso →