
Moteur d'analyse sémantique pour détecter les correctifs de vulnérabilité dans les pilotes du noyau Windows — 58 règles YAML, décompilation Ghidra, traçage d'atteignabilité et scoring
Framework automatisé d'intelligence et de recherche de correctifs
Un moteur d'analyse sémantique pour détecter les corrections de vulnérabilités dans les correctifs de pilotes du noyau Windows. AutoPiff utilise des règles YAML conservatrices pour identifier les modifications de code pertinentes pour la sécurité avec une haute précision et une explicabilité.
AutoPiff analyse les différences entre les versions vulnérables et corrigées des pilotes pour détecter automatiquement :
ExFreePool)memcpy)ProbeForRead/ProbeForWrite)Vendor releases 500 driver updates/year
├── 490 are feature/performance/cosmetic changes
├── 8 are minor bug fixes
└── 2 are silent security fixes (no CVE assigned)
Without automation: Manually review 500 to find 2
With AutoPiff: Review 10 high-scorers to find 2
Les correctifs de sécurité sont souvent publiés sans attribution de CVE. Analyser manuellement en rétro-ingénierie chaque mise à jour de pilote pour trouver celles pertinentes pour la sécurité n'est pas réalisable. AutoPiff résout ce problème en faisant remonter automatiquement les changements qui comptent.
Total : 4 à 12 heures par paire de pilotes réduites à 2 à 5 minutes
┌─────────────────────────────────────────────────────────────────┐
│ AUTOMATISÉ par AutoPiff │
│ ├── Trouver l'aiguille : "Cette fonction a changé près de │
│ │ ExFreePool" │
│ ├── Classifier : "On dirait une correction de use-after-free" │
│ └── Classer : "Score 5.5 - vaut la peine d'être investigué" │
├─────────────────────────────────────────────────────────────────┤
│ ENCORE MANUEL (Votre expertise) │
│ ├── Confirmer l'exploitabilité : "Puis-je vraiment déclencher │
│ │ cela ?" │
│ ├── Analyse des causes profondes : "Pourquoi cela était-il │
│ │ vulnérable ?" │
│ ├── Développement d'exploit : "Comment atteindre ce sink ?" │
│ └── Évaluation de l'impact : "Quel est le risque réel ?" │
└─────────────────────────────────────────────────────────────────┘
AutoPiff ne remplace pas la recherche d'exploitation. Il la rend réalisable à grande échelle en automatisant la phase de reconnaissance.
1. Détection de correctifs silencieux
2. Recherche de vulnérabilités 1-Day
3. Audit de sécurité des fournisseurs
4. Construction d'un corpus historique de CVE
AutoPiff s'exécute en tant que pipeline Karton avec 8 étapes séquentielles plus une branche parallèle de triage DriverAtlas. Chaque étape est un microservice indépendant communiquant via Redis/RabbitMQ.
graph LR
sources["WinBIndex<br/>VirusTotal"]:::src --> s0["Stage 0<br/>Monitor"]
s0 --> s14["Stages 1-4<br/>Patch Differ"]
s0 --> triage["DriverAtlas<br/>Triage"]:::triage
s14 --> s5["Stage 5<br/>Reachability"]
s5 --> s6["Stage 6<br/>Ranking"]
s6 --> s7["Stage 7<br/>Report"]
s6 --> s8["Stage 8<br/>Alerter"]
triage --> alerts["MWDB Tags<br/>+ Alerts"]:::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
AutoPiff inclut 58 règles réparties dans 22 catégories. Voir Docs/semantic_rules.md pour la spécification complète et Docs/SEMANTIC_RULES_REFERENCE.md pour la référence technique.
Le moteur de règles suit plus de 50 symboles d'API dangereux répartis dans 8 groupes de sinks :
memory_copy: RtlCopyMemory, memcpy, memmovepool_alloc: ExAllocatePool, ExAllocatePoolWithTagpool_free: ExFreePool, ExFreePoolWithTaguser_probe: ProbeForRead, ProbeForWriteio_sanitization: RtlULongAdd, RtlSizeTMultexceptions: __try, __exceptstring_copy: strcpy, wcsncpyrefcounting: InterlockedIncrement/DecrementLes résultats sont notés à l'aide d'un modèle configurable (rules/scoring.yaml) :
final_score = semantic_score + reachability_bonus + sink_bonus - penalties
Composantes du score :
Seuils :
git clone https://github.com/splintersfury/AutoPiff.git
cd AutoPiff
docker compose up -d
Pour la pile de production complète avec MWDB, tableaux de bord et surveillance, voir 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)
Modifiez rules/semantic_rules.yaml pour ajouter ou modifier des règles :
rules:
- rule_id: my_custom_rule
category: bounds_check
confidence: 0.85
required_signals:
- sink_group: memory_copy
- change_type: guard_added
- guard_kind: length_check
plain_english_summary: Added length validation before memory copy.
AutoPiff produit des rapports JSON attachés aux échantillons 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": "Pointer is now set to NULL after freeing memory."
}
],
"summary": {
"total_deltas": 1,
"top_score": 5.5,
"match_rate": 100.0
}
}
}
AutoPiff/
├── Docs/ # Documents de conception et spécifications
├── ghidra/scripts/ # Scripts Ghidra sans tête
│ └── autopiff_reachability.py # BFS d'accessibilité + export de décompilation
├── rules/
│ ├── semantic_rules.yaml # 58 règles de détection
│ ├── sinks.yaml # Plus de 50 symboles d'API dangereux
│ └── scoring.yaml # Configuration du modèle de notation
├── schemas/ # Schémas JSON pour chaque étape
├── services/
│ ├── karton-patch-differ/ # Étapes 1-4 : diff + analyse sémantique
│ ├── karton-reachability/ # Étape 5 : graphe d'appels + décompilation
│ ├── karton-ranking/ # Étape 6 : notation
│ ├── karton-report/ # Étape 7 : génération de rapports
│ ├── karton-driver-triage/ # Triage de la surface d'attaque DriverAtlas
│ ├── autopiff-alerter/ # Étape 8 : alertes Telegram
│ ├── driver-monitor/ # Étape 0 : interrogation de versions
│ └── dashboard/ # Interface Web
├── tests/unit/ # 137 tests unitaires
├── docker-compose.yml
└── README.md
AutoPiff est conçu pour fonctionner avec driver_analyzer, qui fournit l'infrastructure de production complète (MWDB, Karton, MinIO, tableaux de bord). Le fichier compose de driver_analyzer construit directement les services AutoPiff :
# 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
Voir le README de driver_analyzer pour les instructions d'installation.
Licence MIT - Voir LICENSE pour les détails.
| Phase | Effort manuel | Avec AutoPiff | Temps gagné |
|---|
| Appariement de versions | 5-15 min/pilote | Automatique | ~100% |
| Décompilation | 2-10 min/binaire | Par lots, parallèle | ~95% |
| Correspondance de fonctions | 30-60 min/paire | Instatané | ~100% |
| Identification des changements de sécurité | 2-8 heures/paire | Secondes | ~99% |
| Triage et classement initiaux | 1-2 heures | Instatané | ~100% |
| Génération de rapports | 30-60 min | Instatané | ~100% |
| Étape | Service | Fonction |
|---|
| 0 | driver-monitor | Interroge WinBIndex et VirusTotal pour les nouvelles versions de pilotes, télécharge sur MWDB |
| 1-4 | karton-patch-differ | Appariement de versions, décompilation Ghidra, correspondance de fonctions, évaluation de règles sémantiques |
| 5 | karton-reachability | BFS du graphe d'appels Ghidra depuis les points d'entrée IOCTL/IRP vers les fonctions modifiées, export complet de la décompilation |
| 6 | karton-ranking | Note les résultats en utilisant l'accessibilité, la sévérité sémantique et la surface d'attaque |
| 7 | karton-report | Génère des rapports markdown structurés, télécharge sur MWDB |
| 8 | autopiff-alerter | Envoie des alertes Telegram pour les résultats avec un score >= 8.0 |
| — | autopiff-driver-triage | Notation de la surface d'attaque DriverAtlas (parallèle à 1-4), étiquette les échantillons MWDB, alertes Telegram |
| Catégorie | Exemple de détection |
|---|
bounds_check | Ajout d'une vérification de longueur avant memcpy |
lifetime_fix | Assignation nulle après ExFreePool |
user_boundary_check | Ajout de ProbeForRead/ProbeForWrite |
int_overflow | Utilisation d'assistant mathématique sécurisé |
state_hardening | Opérations de comptage de référence verrouillées |
ioctl_input_validation | Nouvelles vérifications de taille/type dans les gestionnaires de dispatch |
pool_type_hardening | Migration vers NonPagedPoolNx |
privilege_check | Ajout de SeSinglePrivilegeCheck |
| Variable | Description | Défaut |
|---|
MWDB_API_URL | Point de terminaison de l'API MWDB Core | http://mwdb-core:8080/api/ |
MWDB_API_KEY | Clé API MWDB pour les téléchargements | (requis) |
KARTON_REDIS_HOST | Hôte Redis pour Karton | karton-redis |
AUTOPIFF_GHIDRA_TIMEOUT | Délai d'attente de décompilation Ghidra (secondes) | 900 |
VT_API_KEY | Clé API VirusTotal pour la surveillance des pilotes | (optionnel) |
TELEGRAM_BOT_TOKEN | Jeton de bot Telegram pour les alertes | (optionnel) |
TELEGRAM_CHAT_ID | Chat Telegram pour les alertes | (optionnel) |
AUTOPIFF_SCORE_THRESHOLD | Score minimum pour les alertes Telegram | 8.0 |
DRIVERATLAS_SCORE_THRESHOLD | Score minimum de surface d'attaque pour les alertes de triage | 8.0 |
| Document | Description |
|---|
Docs/semantic_rules.md | Spécification des règles sémantiques : comment les règles sont structurées et ce que chaque catégorie détecte |
Docs/SEMANTIC_RULES_REFERENCE.md | Référence technique pour le moteur de règles, la logique d'évaluation et la notation |
Docs/reachability.md | Spécification de l'étiquetage d'accessibilité : BFS du graphe d'appels depuis les points d'entrée de dispatch |
Docs/reporting.md | Spécification et format de sortie des rapports |
Docs/decisions.md | Décisions de conception et journal de justification |
rules/semantic_rules.yaml | Les 58 règles de détection (YAML) |
rules/sinks.yaml | Plus de 50 symboles d'API dangereux regroupés par catégorie |
rules/scoring.yaml | Configuration du modèle de notation |
schemas/ | Schémas JSON pour chaque sortie d'étape du pipeline |