
Motore di analisi semantica per il rilevamento di correzioni di vulnerabilità nelle patch dei driver del kernel Windows — 58 regole YAML, decompilazione Ghidra, tracciamento della raggiungibilità e punteggio
Automated Patch Intelligence and Finding Framework
Un motore di analisi semantica per rilevare correzioni di vulnerabilità nelle patch dei driver del kernel Windows. AutoPiff utilizza regole YAML conservative per identificare le modifiche al codice rilevanti per la sicurezza con elevata precisione e spiegabilità.
AutoPiff analizza le differenze tra le versioni vulnerabili e quelle corrette dei driver per rilevare automaticamente:
ExFreePool)memcpy)ProbeForRead/ProbeForWrite)Il fornitore rilascia 500 aggiornamenti driver/anno
├── 490 sono modifiche estetiche/di funzionalità/prestazioni
├── 8 sono correzioni di bug minori
└── 2 sono correzioni di sicurezza silenziose (nessun CVE assegnato)
Senza automazione: revisione manuale di 500 per trovare 2
Con AutoPiff: revisione di 10 con punteggio alto per trovare 2
Le patch di sicurezza sono spesso rilasciate senza assegnazione CVE. La reverse engineering manuale di ogni aggiornamento del driver per trovare quelli rilevanti per la sicurezza non è fattibile. AutoPiff risolve questo problema individuando automaticamente le modifiche che contano.
| Fase | Sforzo manuale | Con AutoPiff | Tempo risparmiato |
|---|---|---|---|
| Abbinamento versioni | 5-15 min/driver | Automatico | ~100% |
| Decompilazione | 2-10 min/binario | In batch, parallelo | ~95% |
| Matching funzioni | 30-60 min/coppia | Istantaneo | ~100% |
| Identificazione modifiche di sicurezza | 2-8 ore/coppia | Secondi | ~99% |
| Triage e classificazione iniziale | 1-2 ore | Istantaneo | ~100% |
| Generazione report | 30-60 min | Istantaneo | ~100% |
Totale: da 4-12 ore per coppia di driver a 2-5 minuti
┌─────────────────────────────────────────────────────────────────┐
│ AUTOMATIZZATO da AutoPiff │
│ ├── Trova l'ago: "Questa funzione è cambiata vicino a ExFreePool"│
│ ├── Classifica: "Sembra una correzione use-after-free" │
│ └── Classifica: "Punteggio 5.5 - vale la pena indagare" │
├─────────────────────────────────────────────────────────────────┤
│ ANCORA MANUALE (La tua competenza) │
│ ├── Conferma sfruttabilità: "Posso davvero attivarlo?" │
│ ├── Analisi delle cause profonde: "Perché era vulnerabile?" │
│ ├── Sviluppo exploit: "Come raggiungo questo sink?" │
│ └── Valutazione dell'impatto: "Qual è il rischio nel mondo reale?"│
└─────────────────────────────────────────────────────────────────┘
AutoPiff non sostituisce la ricerca sugli exploit. La rende fattibile su larga scala automatizzando la fase di ricognizione.
1. Rilevamento di patch silenziose
2. Ricerca di vulnerabilità 1-Day
3. Audit di sicurezza del fornitore
4. Creazione di un corpus CVE storico
AutoPiff funziona come una pipeline Karton con 8 fasi sequenziali più un ramo parallelo di triage DriverAtlas. Ogni fase è un microservizio indipendente che comunica tramite Redis/RabbitMQ.
graph LR
sources["WinBIndex<br/>VirusTotal"]:::src --> s0["Fase 0<br/>Monitor"]
s0 --> s14["Fasi 1-4<br/>Patch Differ"]
s0 --> triage["DriverAtlas<br/>Triage"]:::triage
s14 --> s5["Fase 5<br/>Raggiungibilità"]
s5 --> s6["Fase 6<br/>Classificazione"]
s6 --> s7["Fase 7<br/>Report"]
s6 --> s8["Fase 8<br/>Alerter"]
triage --> alerts["MWDB Tags<br/>+ Avvisi"]:::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| Fase | Servizio | Cosa fa |
|---|---|---|
| 0 | driver-monitor | Sonda WinBIndex e VirusTotal per nuove versioni di driver, carica su MWDB |
| 1-4 | karton-patch-differ | Abbinamento versioni, decompilazione Ghidra, matching funzioni, valutazione regole semantiche |
| 5 | karton-reachability | BFS del grafo delle chiamate Ghidra dai punti di ingresso IOCTL/IRP alle funzioni modificate, esportazione decompilazione completa |
| 6 | karton-ranking | Valuta i risultati usando raggiungibilità, gravità semantica e superficie d'attacco |
| 7 | karton-report | Genera report markdown strutturati, carica su MWDB |
| 8 | autopiff-alerter | Invia avvisi Telegram per risultati con punteggio >= 8.0 |
| — | autopiff-driver-triage | Valutazione superficie d'attacco DriverAtlas (parallelo a 1-4), tagga campioni MWDB, avvisi Telegram |
AutoPiff include 58 regole in 22 categorie. Vedi Docs/semantic_rules.md per le specifiche complete e Docs/SEMANTIC_RULES_REFERENCE.md per il riferimento tecnico.
| Categoria | Esempio di rilevamento |
|---|---|
bounds_check | Aggiunto controllo lunghezza prima di memcpy |
lifetime_fix | Assegnazione null dopo ExFreePool |
user_boundary_check | Aggiunto ProbeForRead/ProbeForWrite |
int_overflow | Utilizzo helper matematici sicuri |
state_hardening | Operazioni refcount interlocked |
ioctl_input_validation | Nuovi controlli dimensione/tipo negli handler dispatch |
pool_type_hardening | Migrazione a NonPagedPoolNx |
privilege_check | Aggiunto SeSinglePrivilegeCheck |
Il motore delle regole tiene traccia di oltre 50 simboli API pericolosi in 8 gruppi di sink:
memory_copy: RtlCopyMemory, memcpy, memmovepool_alloc: ExAllocatePool, ExAllocatePoolWithTagpool_free: ExFreePool, ExFreePoolWithTaguser_probe: ProbeForRead, ProbeForWriteio_sanitization: RtlULongAdd, RtlSizeTMultexceptions: __try, __exceptstring_copy: strcpy, wcsncpyrefcounting: InterlockedIncrement/DecrementI risultati vengono valutati utilizzando un modello configurabile (rules/scoring.yaml):
punteggio_finale = punteggio_semantico + bonus_raggiungibilità + bonus_sink - penalità
Componenti del punteggio:
Soglie:
git clone https://github.com/splintersfury/AutoPiff.git
cd AutoPiff
docker compose up -d
Per lo stack di produzione completo con MWDB, dashboard e monitoraggio, vedi 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(nome_funzione, codice_vecchio, codice_nuovo, linee_diff)
| Variabile | Descrizione | Default |
|---|---|---|
MWDB_API_URL | Endpoint API MWDB Core | http://mwdb-core:8080/api/ |
MWDB_API_KEY | Chiave API MWDB per upload | (obbligatorio) |
KARTON_REDIS_HOST | Host Redis per Karton | karton-redis |
AUTOPIFF_GHIDRA_TIMEOUT | Timeout decompilazione Ghidra (sec) | 900 |
VT_API_KEY | Chiave API VirusTotal per monitoraggio driver | (opzionale) |
TELEGRAM_BOT_TOKEN | Token bot Telegram per avvisi | (opzionale) |
TELEGRAM_CHAT_ID | Chat Telegram per avvisi | (opzionale) |
AUTOPIFF_SCORE_THRESHOLD | Punteggio minimo per avvisi Telegram | 8.0 |
DRIVERATLAS_SCORE_THRESHOLD | Punteggio superficie d'attacco minimo per avvisi triage | 8.0 |
Modifica rules/semantic_rules.yaml per aggiungere o modificare regole:
rules:
- rule_id: mia_regola_personalizzata
category: bounds_check
confidence: 0.85
required_signals:
- sink_group: memory_copy
- change_type: guard_added
- guard_kind: length_check
plain_english_summary: Aggiunta validazione lunghezza prima della copia di memoria.
AutoPiff produce report JSON allegati ai campioni 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": "Il puntatore ora viene impostato a NULL dopo la liberazione della memoria."
}
],
"summary": {
"total_deltas": 1,
"top_score": 5.5,
"match_rate": 100.0
}
}
}
| Documento | Descrizione |
|---|---|
Docs/semantic_rules.md | Specifica delle regole semantiche: come sono strutturate le regole e cosa rileva ciascuna categoria |
Docs/SEMANTIC_RULES_REFERENCE.md | Riferimento tecnico per il motore delle regole, la logica di valutazione e il punteggio |
Docs/reachability.md | Specifica del tagging di raggiungibilità: BFS del grafo delle chiamate dai punti di ingresso dispatch |
Docs/reporting.md | Specifica e formato dell'output dei report |
Docs/decisions.md | Decisioni di progettazione e registro motivazioni |
rules/semantic_rules.yaml | Tutte le 58 regole di rilevamento (YAML) |
rules/sinks.yaml | Oltre 50 simboli API pericolosi raggruppati per categoria |
rules/scoring.yaml | Configurazione del modello di punteggio |
schemas/ | Schemi JSON per l'output di ogni fase della pipeline |
AutoPiff/
├── Docs/ # Documenti di progettazione e specifiche
├── ghidra/scripts/ # Script Ghidra headless
│ └── autopiff_reachability.py # BFS raggiungibilità + esportazione decompilazione
├── rules/
│ ├── semantic_rules.yaml # 58 regole di rilevamento
│ ├── sinks.yaml # Oltre 50 simboli API pericolosi
│ └── scoring.yaml # Configurazione del modello di punteggio
├── schemas/ # Schemi JSON per ogni fase
├── services/
│ ├── karton-patch-differ/ # Fasi 1-4: diffing + analisi semantica
│ ├── karton-reachability/ # Fase 5: grafo chiamate + decompilazione
│ ├── karton-ranking/ # Fase 6: punteggio
│ ├── karton-report/ # Fase 7: generazione report
│ ├── karton-driver-triage/ # Triage superficie d'attacco DriverAtlas
│ ├── autopiff-alerter/ # Fase 8: avvisi Telegram
│ ├── driver-monitor/ # Fase 0: polling versioni
│ └── dashboard/ # Interfaccia web
├── tests/unit/ # 137 test unitari
├── docker-compose.yml
└── README.md
AutoPiff è progettato per funzionare con driver_analyzer, che fornisce l'infrastruttura di produzione completa (MWDB, Karton, MinIO, dashboard). Il file compose di driver_analyzer costruisce i servizi AutoPiff direttamente:
# In driver_analyzer/docker-compose.yml
karton-driver-patch-differ:
build:
context: ../AutoPiff
dockerfile: services/karton-patch-differ/Dockerfile
volumes:
- ../AutoPiff/rules:/app/rules:ro
Vedi il README di driver_analyzer per le istruzioni di configurazione.
Licenza MIT - Vedi LICENSE per i dettagli.