Spaces:
Runtime error
Agente Gerador de PoCs (Tester) - Definição do Projeto
Este documento detalha a arquitetura e o fluxo de funcionamento do Agente Gerador de PoCs (Tester), seguindo a mesma estrutura de definição utilizada para o Agente Auditor.
Diagrama do Tester
O Tester é implementado como um StateGraph (LangGraph) que recebe o relatório de vulnerabilidade e itera para gerar, compilar e validar um teste executável (Proof of Concept) usando o framework Foundry.
graph TD
A[Vulnerability Report] -->|Entrada| B(Fase 1: Preparação do Oráculo)
B --> C(Fase 2: Análise da Vulnerabilidade)
C --> D(Fase 3: Geração do PoC)
D --> E(Fase 4: Execução no Foundry)
E -->|Sucesso| F[Fim - PoC Validado]
E -->|Falha| G{Iterações < Max?}
G -->|Sim| H(Reflection - Analisar Erro)
H --> D
G -->|Não| I[Fim - Falha Timeout]
Fase 1: Preparação do Oráculo (oracleNode)
O objetivo desta fase é preparar todo o contexto do repositório para garantir que o LLM tenha as informações corretas de importação e de estado antes de gerar código.
- Geração do Scaffold: Cria a estrutura inicial do arquivo de teste (
Exploit.t.sol), incluindo a funçãosetUp()baseada no construtor do contrato alvo. - Extração de Contexto do Projeto:
- Lê o
remappings.txtdo projeto para resolver caminhos de bibliotecas (ex:@openzeppelin/). - Usa BFS (Breadth-First Search) para encontrar o arquivo
.t.solexistente mais complexo e extrair seusimportscomo referência de padrão.
- Lê o
- Isolamento e Limpeza: Remove testes nativos do projeto do diretório
test/do Foundry para evitar conflitos de compilação quando bibliotecas não estão presentes. - Criação de Stubs (Dependências Faltantes): Executa um
forge buildrápido. Se pacotes externos (node_modules,lib/caviar) estiverem ausentes no ambiente, o agente gera contratos falsos (Stubs) com as interfaces mínimas necessárias para que a compilação prossiga. - Análise de API (AST): Gera a assinatura completa (funções, eventos, erros) do contrato alvo para guiar o LLM.
Fase 2: Análise da Vulnerabilidade (analyzeVulnerabilityNode)
Esta fase interpreta o relatório do Auditor (e o código fonte) para traçar uma estratégia de ataque antes de escrever o teste.
- Recebe o Contexto: Lê o
VulnerabilityReportcontendo:- Descrição da falha
- Revisão do Juiz (explicação técnica do Auditor)
- Exploitable Paths (passo-a-passo sugerido pelo Auditor)
- Contexto geral do protocolo
- Diferença de código da correção (Patch Diff, se executado via benchmark).
- Definição da Estratégia (LLM): Pede ao LLM para responder 4 perguntas críticas:
- Qual a causa raiz?
- Quais as condições de ativação (precondições)?
- Qual a sequência exata de chamadas para o exploit?
- Qual asserção (
assert) provará a vulnerabilidade? (Ex: o saldo roubado deve ser maior que 0, ou a chamada deve reverter com X).
Fase 3: Geração do PoC (generatePoCNode)
É aqui que o código Solidity do exploit é efetivamente escrito. Esta fase adapta o prompt dependendo do estado atual do loop de reflexão.
- Modo
INITIAL: (Primeira tentativa) Gera o código usando o Scaffold do oráculo e a estratégia traçada. - Modo
FIX_COMPILE: (Se falhou ao compilar) Recebe o erro exato do compilador (linha e arquivo). É instruído a verificar imports e tipos. - Modo
MINIMAL_INTERFACE: (Escape Hatch) Se a compilação falhar 3 vezes seguidas, o agente abandona os imports de repositório e injeta interfaces cruas (ex:interface IERC20 { ... }) direto no arquivo de teste. Isso salva execuções que falhariam por dependências quebradas. - Modo
FIX_LOGIC: (Se compilou, mas o teste reverteu) É instruído a verificar a ordem das chamadas, permissões (vm.prank), saldo de setup (vm.deal) e analisar os traces do EVM. Contém padrões prontos para erros clássicos (ex: Reentrancy callback, Unchecked return values).
Fase 4: Execução no Foundry (runFoundryNode & reflectNode)
- Sanitização do Código: Extrai o código Solidity do output do LLM. Valida se o contrato se chama
ExploitTeste a função principal étest_Exploit(). - Execução Isolada: Roda o teste dentro de um container/diretório temporário (
customSandboxDir) usando o comandoforge test. - Análise de Logs (
logAnalyzer):- Parseia a saída bruta do Forge.
- Categoriza o erro em:
COMPILER_ERROR,ASSERTION_FAILED,REVERT_NO_MESSAGE,SETUP_FAILED, etc. - Extrai as linhas cruciais do erro (ex:
Error (6275): Source "src/Token.sol" not found).
- Decisão:
- Passou: Retorna sucesso e o código final.
- Falhou: Envia o log sumarizado de volta para a Fase 3 (via
reflectNode) iterando até oMAX_ITERATIONS(atualmente 6).
Resultados (Avaliação do Benchmark PoCo)
Para avaliar a resiliência do agente e comprovar a arquitetura, ele foi testado contra o dataset público ASSERT-KTH/Proof-of-Patch (22 vulnerabilidades reais auditadas, com correções validadas).
Métricas:
- Reproducibility Rate (Taxa de Reprodução): Capacidade do agente compilar e rodar um PoC que passe na versão vulnerável.
- Specificity Rate (Taxa de Especificidade): Garantia de que o teste criado falha quando executado contra o código já corrigido (prova de que a asserção mirou no bug real, e não em falsos positivos genéricos).
Progressão de Resultados:
- Baseline (Sem Oráculo e sem Reflection inteligente): ~27% de reprodução (falhas massivas de compilação por imports errados).
- Com Oráculo (Remappings + BFS + Stubs): As falhas de compilação caíram drasticamente.
- Com
MINIMAL_INTERFACEe Prompts Refinados: Atingiu 54.5% de reprodução em projetos do mundo real, comprovando a eficácia da adaptação dinâmica do agente perante falhas repetidas.