AI-Assisted Fuzzing & Automated Vulnerability Discovery
Reading time: 6 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Visão Geral
Modelos de linguagem de grande escala (LLMs) podem potencializar pipelines tradicionais de pesquisa de vulnerabilidades gerando entradas semanticamente ricas, evoluindo gramáticas, raciocinando sobre dados de falhas e até propondo correções para múltiplos bugs. Esta página coleta os padrões mais eficazes observados durante as finais do Desafio Cibernético da DARPA (AIxCC) e outras pesquisas públicas.
O que se segue não é uma descrição de um sistema de competição específico, mas uma abstração das técnicas para que você possa reproduzi-las em seus próprios fluxos de trabalho.
1. Entradas de Semente Geradas por LLM
Fuzzers tradicionais guiados por cobertura (AFL++, libFuzzer, Honggfuzz…) começam com um pequeno corpus de sementes e mutam bytes de forma cega. Quando o formato de entrada alvo é complexo (SQL, URLs, protocolos binários personalizados), mutações aleatórias geralmente quebram a sintaxe antes que ramificações interessantes sejam alcançadas.
LLMs podem resolver esse problema de inicialização emitindo geradores de sementes – scripts curtos que produzem entradas sintaticamente corretas, mas relevantes para a segurança. Por exemplo:
SYSTEM: You are a helpful security engineer.
USER:
Write a Python3 program that prints 200 unique SQL injection strings targeting common anti-pattern mistakes (missing quotes, numeric context, stacked queries). Ensure length ≤ 256 bytes / string so they survive common length limits.
# gen_sqli_seeds.py (truncated)
PAYLOADS = [
"1 OR 1=1 -- ",
"' UNION SELECT NULL,NULL--",
"0; DROP TABLE users;--",
...
]
for p in PAYLOADS:
print(p)
Execute uma vez e alimente a saída diretamente no corpus inicial do fuzzer:
python3 gen_sqli_seeds.py > seeds.txt
afl-fuzz -i seeds.txt -o findings/ -- ./target @@
Benefícios:
- Validade semântica → cobertura mais profunda no início.
- Re-gerável: ajuste o prompt para focar em XSS, travessia de caminho, blobs binários, etc.
- Barato (< 1 ¢ com GPT-3.5).
Dicas
- Instrua o modelo a diversificar o comprimento e a codificação da carga útil (UTF-8, URL-encoded, UTF-16-LE) para contornar filtros superficiais.
- Peça um único script autossuficiente – evita problemas de formatação JSON.
2. Fuzzing de Evolução Gramatical
Uma variante mais poderosa é deixar o LLM evoluir uma gramática em vez de sementes concretas. O fluxo de trabalho (“padrão Grammar Guy”) é:
- Gere uma gramática inicial ANTLR/Peach/LibFuzzer via prompt.
- Fuzz por N minutos e colete métricas de cobertura (arestas / blocos atingidos).
- Resuma as áreas do programa não cobertas e alimente o resumo de volta no modelo:
A gramática anterior acionou 12 % das arestas do programa. Funções não alcançadas: parse_auth, handle_upload. Adicione / modifique regras para cobrir essas.
- Mescle as novas regras, re-fuzz, repita.
Esqueleto de pseudo-código:
for epoch in range(MAX_EPOCHS):
grammar = llm.refine(grammar, feedback=coverage_stats)
save(grammar, f"grammar_{epoch}.txt")
coverage_stats = run_fuzzer(grammar)
Pontos principais:
- Mantenha um orçamento – cada refinamento usa tokens.
- Use instruções
diff
+patch
para que o modelo edite em vez de reescrever. - Pare quando Δcobertura < ε.
3. Geração de PoV (Exploit) Baseada em Agentes
Depois que um crash é encontrado, você ainda precisa de uma prova de vulnerabilidade (PoV) que a acione de forma determinística.
Uma abordagem escalável é gerar milhares de agentes leves (<process/thread/container/prisoner>), cada um executando um LLM diferente (GPT-4, Claude, Mixtral) ou configuração de temperatura.
Pipeline:
- Análise estática/dinâmica produz candidatos a bugs (struct com PC de crash, fatia de entrada, mensagem de sanitização).
- Orquestrador distribui candidatos para os agentes.
- Etapas de raciocínio do agente:
a. Reproduzir o bug localmente com
gdb
+ entrada. b. Sugerir carga útil mínima de exploit. c. Validar exploit em sandbox. Se sucesso → submeter. - Tentativas falhadas são re-colocadas como novas sementes para fuzzing de cobertura (loop de feedback).
Vantagens:
- A paralelização oculta a falta de confiabilidade de um único agente.
- Autoajuste de temperatura/tamanho do modelo com base na taxa de sucesso observada.
4. Fuzzing Direcionado com Modelos de Código Ajustados
Ajuste um modelo de peso aberto (por exemplo, Llama-7B) em código-fonte C/C++ rotulado com padrões de vulnerabilidade (overflow de inteiro, cópia de buffer, string de formato). Então:
- Execute análise estática para obter lista de funções + AST.
- Solicite ao modelo: “Dê entradas de dicionário de mutação que provavelmente quebrarão a segurança da memória na função X”.
- Insira esses tokens em um
AFL_CUSTOM_MUTATOR
.
Exemplo de saída para um wrapper sprintf
:
{"pattern":"%99999999s"}
{"pattern":"AAAAAAAA....<1024>....%n"}
Empiricamente, isso reduz o tempo até a falha em mais de 2× em alvos reais.
5. Estratégias de Patching Guiadas por IA
5.1 Super Patches
Peça ao modelo para agrupar assinaturas de falhas e propor um único patch que remove a causa raiz comum. Envie uma vez, conserte vários bugs → menos penalidades de precisão em ambientes onde cada patch errado custa pontos.
Esboço do prompt:
Here are 10 stack traces + file snippets. Identify the shared mistake and generate a unified diff fixing all occurrences.
5.2 Taxa de Patch Especulativa
Implemente uma fila onde patches confirmados validados por PoV e patches especulativos (sem PoV) são intercalados em uma proporção de 1:N ajustada às regras de pontuação (por exemplo, 2 especulativos : 1 confirmado). Um modelo de custo monitora penalidades vs. pontos e ajusta N automaticamente.
Juntando Tudo
Um CRS (Sistema de Raciocínio Cibernético) de ponta a ponta pode conectar os componentes assim:
graph TD
subgraph Discovery
A[LLM Seed/Grammar Gen] --> B[Fuzzer]
C[Fine-Tuned Model Dicts] --> B
end
B --> D[Crash DB]
D --> E[Agent PoV Gen]
E -->|valid PoV| PatchQueue
D -->|cluster| F[LLM Super-Patch]
PatchQueue --> G[Patch Submitter]
Referências
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.