
Mecanismo de análise semântica para detecção de correções de vulnerabilidades em patches de driver do kernel Windows — 58 regras YAML, descompilação Ghidra, rastreamento de alcançabilidade e pontuação
Estrutura Automatizada de Inteligência e Descoberta de Patches
Um motor de análise semântica para detecção de correções de vulnerabilidades em patches de drivers do kernel do Windows. AutoPiff usa regras YAML conservadoras para identificar alterações de código relevantes para segurança com alta precisão e explicabilidade.
O AutoPiff analisa as diferenças entre versões vulneráveis e corrigidas de drivers para detectar automaticamente:
ExFreePool)memcpy)ProbeForRead/ProbeForWrite)Fornecedor lança 500 atualizações de driver/ano
├── 490 são alterações de funcionalidade/desempenho/estética
├── 8 são correções de bugs menores
└── 2 são correções de segurança silenciosas (sem CVE atribuído)
Sem automação: Revisar manualmente 500 para encontrar 2
Com AutoPiff: Revisar 10 de alta pontuação para encontrar 2
Patches de segurança são frequentemente lançados sem atribuição de CVE. Reverter manualmente todas as atualizações de driver para encontrar as relevantes para segurança não é viável. O AutoPiff resolve isso exibindo automaticamente as alterações que importam.
Total: 4-12 horas por par de drivers reduzido para 2-5 minutos
┌─────────────────────────────────────────────────────────────────┐
│ AUTOMATIZADO pelo AutoPiff │
│ ├── Encontrar a agulha: "Esta função mudou perto de ExFreePool"│
│ ├── Classificar: "Parece uma correção de use-after-free" │
│ └── Classificar: "Pontuação 5.5 - vale a pena investigar" │
├─────────────────────────────────────────────────────────────────┤
│ AINDA MANUAL (Sua expertise) │
│ ├── Confirmar explorabilidade: "Posso realmente acionar isso?" │
│ ├── Análise de causa raiz: "Por que isso era vulnerável?" │
│ ├── Desenvolvimento de exploit: "Como alcanço este sink?" │
│ └── Avaliação de impacto: "Qual é o risco no mundo real?" │
└─────────────────────────────────────────────────────────────────┘
O AutoPiff não substitui a pesquisa de exploração. Torna-a viável em escala ao automatizar a fase de reconhecimento.
1. Detecção de Patch Silencioso
2. Pesquisa de Vulnerabilidade de 1 Dia
3. Auditoria de Segurança do Fornecedor
4. Construção de Corpus CVE Histórico
O AutoPiff executa como um pipeline Karton com 8 estágios sequenciais mais uma ramificação paralela de triagem DriverAtlas. Cada estágio é um microsserviço independente que se comunica via Redis/RabbitMQ.
graph LR
sources["WinBIndex<br/>VirusTotal"]:::src --> s0["Estágio 0<br/>Monitor"]
s0 --> s14["Estágios 1-4<br/>Differ de Patch"]
s0 --> triage["DriverAtlas<br/>Triagem"]:::triage
s14 --> s5["Estágio 5<br/>Alcançabilidade"]
s5 --> s6["Estágio 6<br/>Classificação"]
s6 --> s7["Estágio 7<br/>Relatório"]
s6 --> s8["Estágio 8<br/>Alertador"]
triage --> alerts["Tags MWDB<br/>+ Alertas"]:::triage
classDef src fill:#1a1a2e,stroke:#e94560,color:#eee
classDef triage fill:#1a1a2e,stroke:#e9a345,color:#eee
classDef default fill:#16213e,stroke:#0f3460,color:#eee
O AutoPiff inclui 58 regras em 22 categorias. Veja Docs/semantic_rules.md para a especificação completa e Docs/SEMANTIC_RULES_REFERENCE.md para a referência técnica.
O mecanismo de regras rastreia 50+ símbolos de API perigosos em 8 grupos de sink:
memory_copy: RtlCopyMemory, memcpy, memmovepool_alloc: ExAllocatePool, ExAllocatePoolWithTagpool_free: ExFreePool, ExFreePoolWithTaguser_probe: ProbeForRead, ProbeForWriteio_sanitization: RtlULongAdd, RtlSizeTMultexceptions: __try, __exceptstring_copy: strcpy, wcsncpyrefcounting: InterlockedIncrement/DecrementAs descobertas são pontuadas usando um modelo configurável (rules/scoring.yaml):
pontuacao_final = pontuacao_semantica + bonus_alcançabilidade + bonus_sink - penalidades
Componentes da Pontuação:
Limites:
git clone https://github.com/splintersfury/AutoPiff.git
cd AutoPiff
docker compose up -d
Para a stack completa de produção com MWDB, dashboards e monitoramento, veja driver_analyzer.
pip install pyyaml
from services.karton_patch_differ.rule_engine import SemanticRuleEngine
engine = SemanticRuleEngine('rules/semantic_rules.yaml', 'rules/sinks.yaml')
hits = engine.evaluate(func_name, old_code, new_code, diff_lines)
Edite rules/semantic_rules.yaml para adicionar ou modificar regras:
rules:
- rule_id: minha_regra_personalizada
category: bounds_check
confidence: 0.85
required_signals:
- sink_group: memory_copy
- change_type: guard_added
- guard_kind: length_check
plain_english_summary: Validação de tamanho adicionada antes da cópia de memória.
O AutoPiff produz relatórios JSON anexados a amostras MWDB:
{
"pairing": {
"driver_new": {"sha256": "...", "version": "2.0.9.0"},
"driver_old": {"sha256": "...", "version": "2.0.8.0"},
"decision": "accept",
"confidence": 0.95
},
"semantic_deltas": {
"deltas": [
{
"function": "HandleIoctl",
"rule_id": "null_after_free_added",
"category": "lifetime_fix",
"confidence": 0.88,
"sinks": ["pool_free"],
"final_score": 5.5,
"why_matters": "O ponteiro agora é definido como NULL após liberar memória."
}
],
"summary": {
"total_deltas": 1,
"top_score": 5.5,
"match_rate": 100.0
}
}
}
AutoPiff/
├── Docs/ # Documentos de design e especificações
├── ghidra/scripts/ # Scripts Ghidra headless
│ └── autopiff_reachability.py # BFS de alcançabilidade + exportação de decompilação
├── rules/
│ ├── semantic_rules.yaml # 58 regras de detecção
│ ├── sinks.yaml # 50+ símbolos de API perigosos
│ └── scoring.yaml # Configuração do modelo de pontuação
├── schemas/ # Schemas JSON para cada estágio
├── services/
│ ├── karton-patch-differ/ # Estágios 1-4: diff + análise semântica
│ ├── karton-reachability/ # Estágio 5: grafo de chamadas + decompilação
│ ├── karton-ranking/ # Estágio 6: pontuação
│ ├── karton-report/ # Estágio 7: geração de relatório
│ ├── karton-driver-triage/ # Triagem de superfície de ataque DriverAtlas
│ ├── autopiff-alerter/ # Estágio 8: alertas Telegram
│ ├── driver-monitor/ # Estágio 0: consulta de versões
│ └── dashboard/ # Interface web
├── tests/unit/ # 137 testes unitários
├── docker-compose.yml
└── README.md
O AutoPiff foi projetado para funcionar com driver_analyzer, que fornece a infraestrutura completa de produção (MWDB, Karton, MinIO, dashboards). O arquivo compose do driver_analyzer constrói os serviços AutoPiff diretamente:
# Em driver_analyzer/docker-compose.yml
karton-driver-patch-differ:
build:
context: ../AutoPiff
dockerfile: services/karton-patch-differ/Dockerfile
volumes:
- ../AutoPiff/rules:/app/rules:ro
Veja o README do driver_analyzer para instruções de configuração.
Licença MIT - Veja LICENSE para detalhes.
| Fase | Esforço Manual | Com AutoPiff | Tempo Economizado |
|---|
| Emparelhamento de versões | 5-15 min/driver | Automático | ~100% |
| Decompilação | 2-10 min/binário | Em lote, paralelo | ~95% |
| Correspondência de funções | 30-60 min/par | Instantâneo | ~100% |
| Identificação de alterações de segurança | 2-8 horas/par | Segundos | ~99% |
| Triagem e classificação inicial | 1-2 horas | Instantâneo | ~100% |
| Geração de relatório | 30-60 min | Instantâneo | ~100% |
| Estágio | Serviço | O que faz |
|---|
| 0 | driver-monitor | Consulta WinBIndex e VirusTotal por novas versões de driver, envia para MWDB |
| 1-4 | karton-patch-differ | Emparelhamento de versões, decompilação Ghidra, correspondência de funções, avaliação de regras semânticas |
| 5 | karton-reachability | BFS no grafo de chamadas Ghidra de pontos de entrada IOCTL/IRP para funções alteradas, exportação completa de decompilação |
| 6 | karton-ranking | Pontua descobertas usando alcançabilidade, severidade semântica e superfície de ataque |
| 7 | karton-report | Gera relatórios markdown estruturados, envia para MWDB |
| 8 | autopiff-alerter | Envia alertas Telegram para descobertas com pontuação >= 8.0 |
| — | autopiff-driver-triage | Pontuação de superfície de ataque DriverAtlas (paralelo a 1-4), marca amostras MWDB, alertas Telegram |
| Categoria | Exemplo de Detecção |
|---|
bounds_check | Verificação de tamanho adicionada antes de memcpy |
lifetime_fix | Atribuição nula após ExFreePool |
user_boundary_check | Adicionado ProbeForRead/ProbeForWrite |
int_overflow | Uso de auxiliar matemático seguro |
state_hardening | Operações de contagem de referência intercravada |
ioctl_input_validation | Novas verificações de tamanho/tipo em manipuladores de dispatch |
pool_type_hardening | Migração para NonPagedPoolNx |
privilege_check | Adicionado SeSinglePrivilegeCheck |
| Variável | Descrição | Padrão |
|---|
MWDB_API_URL | Endpoint da API MWDB Core | http://mwdb-core:8080/api/ |
MWDB_API_KEY | Chave da API MWDB para uploads | (obrigatório) |
KARTON_REDIS_HOST | Host Redis para Karton | karton-redis |
AUTOPIFF_GHIDRA_TIMEOUT | Tempo limite de decompilação Ghidra (seg) | 900 |
VT_API_KEY | Chave da API VirusTotal para monitoramento de drivers | (opcional) |
TELEGRAM_BOT_TOKEN | Token do bot Telegram para alertas | (opcional) |
TELEGRAM_CHAT_ID | Chat Telegram para alertas | (opcional) |
AUTOPIFF_SCORE_THRESHOLD | Pontuação mínima para alertas Telegram | 8.0 |
DRIVERATLAS_SCORE_THRESHOLD | Pontuação mínima de superfície de ataque para alertas de triagem | 8.0 |
| Documento | Descrição |
|---|
Docs/semantic_rules.md | Especificação de regras semânticas: como as regras são estruturadas e o que cada categoria detecta |
Docs/SEMANTIC_RULES_REFERENCE.md | Referência técnica para o mecanismo de regras, lógica de avaliação e pontuação |
Docs/reachability.md | Especificação de etiquetagem de alcançabilidade: BFS no grafo de chamadas a partir de pontos de entrada de dispatch |
Docs/reporting.md | Especificação e formato de saída do relatório |
Docs/decisions.md | Decisões de design e registro de fundamentação |
rules/semantic_rules.yaml | Todas as 58 regras de detecção (YAML) |
rules/sinks.yaml | 50+ símbolos de API perigosos agrupados por categoria |
rules/scoring.yaml | Configuração do modelo de pontuação |
schemas/ | Schemas JSON para saída de cada estágio do pipeline |