Un système intelligent de détection de domaines malveillants basé sur l'analyse des enregistrements TXT DNS par apprentissage automatique
Ce projet représente le travail que j'ai effectué durant mon stage de 3 mois au Laboratoire d'Informatique de Grenoble (LIG). Il s'inscrit dans le cadre de recherches sur la sécurité des infrastructures DNS et l'application de l'apprentissage automatique à la détection de menaces cyber. Le rapport complet détaillant la méthodologie, les résultats et les analyses est disponible dans /docs/Rapport de stage final.pdf.
Propriété des données Les données utilisées dans ce projet (domaines, enregistrements DNS TXT, étiquettes, etc.) sont la propriété du Laboratoire d’Informatique de Grenoble (LIG). Le jeu de données complet n’est pas rendu public et n’est pas inclus dans ce dépôt. Seul un échantillon représentatif est fourni à des fins de démonstration et de reproductibilité.
Avant de plonger dans les détails techniques, nous vous recommandons de visionner cette présentation générée par NotebookLM qui explique les fondamentaux de la recherche DNS TXT et les enjeux de sécurité :
Cette vidéo est basée sur l'article scientifique "TXTing 101: Finding Security Issues in the Long Tail of DNS TXT Records" et couvre :
- Qu'est-ce que le DNS et les enregistrements TXT
- Pourquoi les enregistrements TXT sont cruciaux pour la sécurité
- Comment les attaquants exploitent les records TXT à des fins malveillantes
- Les motivations derrière cette recherche
- Vue d'ensemble
- Problématique et motivation
- Architecture du système
- Fonctionnalités principales
- Installation
- Utilisation
- Structure du projet
- Performance du modèle
- Documentation technique
- Contribution et licence
DNS TXT Malware Detection with AI est un système complet de détection de domaines malveillants qui analyse les enregistrements TXT DNS pour identifier automatiquement les menaces potentielles. Le système utilise un modèle de Machine Learning entraîné sur plus de 23 millions de domaines et atteint une précision de 92%.
Le système repose sur l'hypothèse que les domaines malveillants et bénins présentent des signatures DNS TXT distinctes. En extrayant et en analysant ces enregistrements avec 134 expressions régulières, puis en les transformant en vecteurs de caractéristiques, un modèle d'arbre de décision peut prédire avec haute fiabilité si un domaine est malveillant ou bénin.
1. Collecte DNS → Récupération automatique des records TXT
2. Classification → Application de 134 patterns regex
3. Vectorisation → Transformation en vecteur 91 dimensions
4. Prédiction ML → Classification par Decision Tree
Les enregistrements TXT DNS sont conçus pour stocker des informations textuelles arbitraires associées à un domaine. Ils sont largement utilisés pour :
- Vérification de propriété de domaine (Google, Microsoft, etc.)
- Configuration de sécurité email (SPF, DMARC, DKIM)
- Validation de certificats SSL (ACME challenges)
- Métadonnées de services (Stripe, Salesforce, Atlassian)
Cependant, cette flexibilité fait également des enregistrements TXT une cible attractive pour les activités malveillantes :
- Command & Control (C2) - Canaux de communication cachés pour malwares
- Data exfiltration - Tunneling DNS pour extraire des données sensibles
- Domain Generation Algorithms (DGA) - Génération automatique de domaines malveillants
- Phishing infrastructure - Configuration DNS suspecte pour sites de phishing
- Cryptojacking - Distribution de scripts de minage via DNS
Contrairement aux méthodes traditionnelles qui se concentrent sur les noms de domaine ou les adresses IP, notre système analyse le contenu même des enregistrements TXT pour détecter des patterns malveillants. Cette approche permet de :
- Détecter des menaces qui échapperaient aux listes noires traditionnelles
- Identifier de nouveaux domaines malveillants avant leur référencement
- Comprendre les configurations DNS typiques des infrastructures malveillantes
- Fournir une décision exploitable en quelques secondes
┌─────────────────────────────────────────────────────────────────────┐
│ SYSTÈME DE DÉTECTION │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Collecte │ ───> │Classification│ ───> │Vectorisation │ │
│ │ DNS TXT │ │ 134 Regex │ │ 91 features │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ │ │ │ │
│ v v v │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Modèle Decision Tree │ │
│ │ (23M+ domaines d'entraînement) │ │
│ │ Accuracy: 92% | AUC: 0.869 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ v │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Résultat: BENIGN ou MALICIOUS + Probabilités │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
-
Scripts de collecte DNS (
scripts/)txtfetcher.py- Collecte séquentielletxtfetcher_mp.py- Collecte parallèle (multiprocessing)domain_predictor.py- Prédicteur CLI interactif
-
Moteur d'analyse (
src/analysis/)- Classification par 134 expressions régulières
- Enrichissement avec Bad Domain Archive (3.3M domaines)
- Enrichissement avec Spamhaus DBL
-
Pipeline Machine Learning (
src/ml/)- Agrégation et vectorisation des données
- Entraînement du modèle Decision Tree
- Analyse ROC et optimisation du seuil
- Modèle sauvegardé (92% accuracy)
-
Interface graphique (
src/gui/)- Application PyQt5 avec architecture MVC
- 5 pages : Analyse simple, multiple, avancée, historique, à propos
- Visualisations interactives (graphiques, tableaux)
-
Framework de tests (
tests/)- Tests du modèle ML (synthétiques + feature importance)
- Tests de classification regex (8979 échantillons)
- Rapports d'évaluation détaillés
L'application PyQt5 offre une interface intuitive pour analyser les domaines :
Fonctionnalités :
- Saisie et validation d'un nom de domaine
- Affichage des enregistrements TXT récupérés
- Classification de chaque TXT par catégorie
- Prédiction ML avec classe et probabilités
- Export des résultats
Fonctionnalités :
- Analyse par batch (liste ou fichier)
- Barre de progression en temps réel
- Tableau de résultats avec tri et filtrage
- Graphiques de distribution (benign/malicious)
- Statistiques agrégées
- Export CSV/JSON
Pour l'automatisation et l'intégration dans des scripts :
python scripts/domain_predictor.py example.comSortie formatée :
================================================================================
DOMAIN REPUTATION PREDICTOR - CLI VERSION
================================================================================
RÉSULTATS POUR: example.com
--------------------------------------------------------------------------------
TXT RECORDS TROUVÉS (2):
1. "v=spf1 include:_spf.google.com ~all"
└─> Catégorie: SPF
2. "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"
└─> Catégorie: DMARC
CLASSE PRÉDITE: BENIGN [OK]
STATISTIQUES PAR CATÉGORIE:
- SPF: 1
- DMARC: 1
PROBABILITÉS:
benign ######################################## 98.5%
malicious #....................................... 1.5%
Temps d'exécution: 0.342 secondes
================================================================================
Pour analyser des millions de domaines :
# Collecte parallèle avec 8 workers
python scripts/txtfetcher_mp.py domains.txt output.csv --workers 8
# Classification par regex
python src/analysis/regex_classification/analyzer_mp.py output.csv classified.csv --workers 8- Python 3.8 ou supérieur
- pip (gestionnaire de paquets Python)
- Git (pour cloner le repository)
- Connexion Internet (pour les requêtes DNS)
git clone https://github.com/votre-username/DNS-txt-malware-detection-with-AI.git
cd DNS-txt-malware-detection-with-AI# Sur Linux/macOS
python3 -m venv venv
source venv/bin/activate
# Sur Windows
python -m venv venv
venv\Scripts\activatepip install -r requirements.txtDépendances principales :
pandas>=1.5.0- Manipulation de donnéesscikit-learn>=1.3.0- Machine LearningPyQt5>=5.15.0- Interface graphiquednspython>=2.3.0- Requêtes DNSmatplotlib>=3.6.0- Visualisationstqdm>=4.64.0- Barres de progression
python test_paths.pySortie attendue :
Vérification des chemins...
[OK] Modèle trouvé: src/ml/ml_model/dt_model_config_fin.pkl
[OK] Features trouvées: src/ml/ml_model/dcf.csv
[OK] Module regex importé avec succès
[OK] 134 patterns regex chargés
Installation validée avec succès !
python src/gui/main.pyL'application se lance avec une fenêtre principale contenant 5 onglets :
- Analyse simple - Analyser un domaine unique
- Analyse multiple - Analyser plusieurs domaines en batch
- Analyse avancée - Options de configuration avancées
- Historique - Consulter les analyses précédentes
- À propos - Informations sur le projet
python scripts/domain_predictor.pyLe script vous demandera d'entrer le nom du domaine à analyser.
python scripts/domain_predictor.py google.compython scripts/txtfetcher.py domains.txt output.csvpython scripts/txtfetcher_mp.py domains.txt output.csv --workers 8Arguments :
domains.txt- Fichier avec un domaine par ligneoutput.csv- Fichier de sortie au format CSV--workers N- Nombre de processus parallèles (défaut: 4)
Format de sortie :
Domain,TXT
google.com,"""v=spf1 include:_spf.google.com ~all"""
google.com,"""v=DMARC1; p=quarantine; rua=mailto:dmarc@google.com"""python src/analysis/regex_classification/analyzer_mp.py input.csv output.csv --workers 8Format de sortie enrichi :
Domain,TXT,Category,Label
google.com,"v=spf1...",Security,SPF
google.com,"v=DMARC1...",Security,DMARCpython tests/run_all_tests.py# Test du modèle ML
python tests/test_ml_model.py
# Test de classification regex
python tests/test_regex_classification.pySorties :
tests/output/ml_model_evaluation.txt- Rapport complet du modèletests/output/classification_results.csv- Résultats de classification
DNS-txt-malware-detection-with-AI/
│
├── README.md # Ce fichier
├── requirements.txt # Dépendances Python
├── setup.py # Configuration d'installation
├── test_paths.py # Validation de l'installation
│
├── data/ # Données brutes (non versionnées)
├── samples/ # Échantillons pour tests
│ ├── txt_records_sample.csv # 8979 enregistrements TXT
│ └── txt_records_sample.json # Version JSON
│ └── raw_dataset_sample.csv # Échantillon de jeu de données AVANT traitement
│ └── balanced_dataset_sample.csv # Échantillon de jeu de données équilibré 10k (APRÈS feature engineering: 5 k bénins / 5 k malveillants),extrait d’un jeu de données plus large (23 M)
├── scripts/ # Scripts utilitaires et CLI
│ ├── txtfetcher.py # Collecte DNS séquentielle
│ ├── txtfetcher_mp.py # Collecte DNS parallèle
│ └── domain_predictor.py # Prédicteur CLI
│
├── src/ # Code source principal
│ ├── analysis/ # Analyse et enrichissement
│ │ ├── regex_classification/ # 134 regex + classificateurs
│ │ ├── bad_domains_archive/ # Enrichissement BDA
│ │ └── spamhaus/ # Enrichissement Spamhaus DBL
│ │
│ ├── ml/ # Machine Learning
│ │ ├── ml_model/ # Modèle + features
│ │ │ ├── dt_model_config_fin.pkl
│ │ │ └── dcf.csv
│ │ ├── train.py # Entraînement standard
│ │ ├── train_with_roc.py # Entraînement avec ROC
│ │ ├── agreg2.py # Vectorisation
│ │ └── _class.py # Utilitaires
│ │
│ └── gui/ # Interface graphique PyQt5
│ ├── main.py # Point d'entrée
│ ├── config/ # Configuration
│ ├── models/ # Logique métier (MVC)
│ ├── views/ # Interfaces utilisateur
│ │ ├── main_window.py
│ │ └── pages/ # 5 pages de l'application
│ ├── controllers/ # Contrôleurs (orchestration)
│ └── utils/ # Utilitaires et styles
│
├── tests/ # Tests et validation
│ ├── test_ml_model.py # Tests du modèle ML
│ ├── test_regex_classification.py # Tests des regex
│ ├── run_all_tests.py # Lanceur de tests
│ ├── README.md # Documentation des tests
│ └── output/ # Résultats des tests
│
└── docs/ # Documentation technique
├── README.md # Index de la documentation
├── PROJECT_ARCHITECTURE.md # Architecture complète
├── ML_MODEL_DOCUMENTATION.md # Documentation du modèle ML
├── documentation_regex.pdf # 134 regex documentées
├── images/ # Captures d'écran
│ ├── roc_curve.png
│ ├── single_domain_window.png
│ └── multiple_domains_window.png
└── videos/ # Démonstrations
└── DNS_txt_records_scientific_research.mp4
Le modèle Decision Tree a été entraîné sur 23,382,012 domaines (20M bénins + 3.3M malveillants) avec les performances suivantes :
MÉTRIQUES DE CLASSIFICATION
precision recall f1-score support
benign 0.93 0.98 0.95 3435916
malicious 0.69 0.40 0.51 418648
accuracy 0.92 3854564
macro avg 0.81 0.69 0.73 3854564
weighted avg 0.90 0.92 0.91 3854564
AUC Score: 0.869
- Accuracy globale : 92% - Le modèle classe correctement 92% des domaines
- Précision benign : 93% - 93% des domaines classés comme bénins le sont réellement
- Rappel benign : 98% - 98% des domaines bénins sont détectés
- Précision malicious : 69% - 69% des domaines classés comme malveillants le sont réellement
- Rappel malicious : 40% - 40% des domaines malveillants sont détectés (seuil par défaut 0.5)
L'analyse ROC a identifié un seuil optimal de 0.1862 qui permet de :
- Détecter 96% des domaines malveillants (vs 40% avec seuil 0.5)
- Accepter 24% de faux positifs (compromis acceptable en cybersécurité)
- AUC de 0.869 - Excellente capacité discriminative
| Scénario | Seuil | Détection | Faux positifs | Usage |
|---|---|---|---|---|
| Blocage automatique | 0.5 | 40% | 5% | Bloquer sans intervention humaine |
| Surveillance proactive | 0.1862 | 96% | 24% | Alerter pour investigation |
| Détection maximale | 0.05 | 99% | 45% | Recherche exhaustive de menaces |
| Rang | Feature | Importance | Description |
|---|---|---|---|
| 1 | SPF | 61.9% | Présence d'enregistrements SPF |
| 2 | DMARC | 19.8% | Présence d'enregistrements DMARC |
| 3 | Empty | 16.8% | Absence d'enregistrements TXT |
| 4 | Verification Keywords | 1.4% | Mots-clés de vérification |
| 5 | Pattern Keywords | 0.07% | Patterns de mots-clés suspects |
Observation clé : Les 3 premières features (SPF, DMARC, Empty) représentent 98.5% de l'importance totale du modèle.
-
PROJECT_ARCHITECTURE.md (1218 lignes)
- Architecture complète du système
- Description détaillée de tous les modules et scripts
- 5 pipelines documentés de bout en bout
- Guide de navigation dans le code
-
ML_MODEL_DOCUMENTATION.md (471 lignes)
- Vue d'ensemble du modèle prédictif
- Pipeline de traitement en 4 étapes
- Préparation des données (23M+ domaines)
- Entraînement et optimisation
- Analyse ROC détaillée
- Interprétation et limitations
-
- Guide d'utilisation du framework de tests
- Description des tests disponibles
- Interprétation des résultats
-
- Documentation des scripts CLI
- Exemples d'utilisation
- Paramètres et options
- Comprendre l'architecture globale → PROJECT_ARCHITECTURE.md sections 1-2
- Comprendre un script spécifique → PROJECT_ARCHITECTURE.md section 3
- Comprendre les flux de travail → PROJECT_ARCHITECTURE.md section 4
- Comprendre le modèle ML → ML_MODEL_DOCUMENTATION.md
- Optimiser les performances → ML_MODEL_DOCUMENTATION.md section 6
Scenario : Un analyste de sécurité veut vérifier si un nouveau domaine suspect est malveillant.
Solution :
python scripts/domain_predictor.py suspicious-domain.comRésultat : Décision en < 1 seconde avec justification.
Scenario : Une entreprise veut vérifier une liste de 10 000 domaines tiers.
Solution :
# Collecte DNS
python scripts/txtfetcher_mp.py domains.txt dns_data.csv --workers 8
# Classification
python src/analysis/regex_classification/analyzer_mp.py dns_data.csv classified.csv --workers 8
# Import dans GUI pour visualisation
python src/gui/main.py
# → Onglet "Analyse multiple" → Importer classified.csvScenario : Identifier des domaines malveillants dans des logs de trafic réseau.
Solution :
# Extraire les domaines uniques des logs
cat network_logs.txt | grep -oE '[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' | sort -u > domains.txt
# Analyser avec le système
python scripts/txtfetcher_mp.py domains.txt results.csv --workers 16
python src/analysis/regex_classification/analyzer_mp.py results.csv analyzed.csv --workers 16
# Filtrer les malveillants
# (script personnalisé ou import GUI)Scenario : Intégrer la détection dans une plateforme SIEM existante.
Solution :
# Exemple d'intégration Python
from scripts.domain_predictor import DomainPredictor
predictor = DomainPredictor()
# Analyser un domaine
pred, labels, txts, features = predictor.predict("example.com")
# Envoyer l'alerte si malveillant
if pred.lower() == "malicious":
send_alert_to_siem({
"domain": "example.com",
"prediction": pred,
"confidence": features,
"txt_records": txts
})Scenario : Étudier les configurations DNS des domaines malveillants vs bénins.
Solution :
- Utiliser les scripts de collecte massive pour constituer un dataset
- Analyser avec le système pour classification automatique
- Exporter les résultats pour analyse statistique
- Consulter ML_MODEL_DOCUMENTATION.md pour méthodologie
-
Dépendance à la qualité des sources de vérité
- La classification repose sur Bad Domain Archive et Spamhaus DBL
- Des domaines malveillants non référencés peuvent être classés comme bénins
-
Évolution temporelle
- Les pratiques malveillantes évoluent rapidement
- Réentraînement périodique recommandé (tous les 3-6 mois)
-
Simplification des données
- Seule la présence/absence de catégories est comptabilisée
- Le contenu exact des enregistrements n'est pas analysé en détail
-
Biais vers la classe majoritaire
- Le modèle tend à favoriser la classification "benign"
- Ajuster le seuil selon le niveau de risque acceptable
- Utiliser comme outil d'aide à la décision, non comme vérité absolue
- Valider manuellement les cas critiques avant action définitive
- Combiner avec d'autres sources (WHOIS, réputation IP, contenu web)
- Monitorer les performances en production et ajuster les seuils
- Réentraîner régulièrement avec des données récentes
- Requêtes DNS : Limitées par les timeouts et rate-limiting des serveurs DNS
- Multiprocessing : Ajuster le nombre de workers selon les ressources disponibles
- Mémoire : L'analyse de millions de domaines nécessite une gestion efficace de la RAM
- Stockage : Les dumps DNS complets peuvent occuper plusieurs Go
| Catégorie | Technologies |
|---|---|
| Langage | Python 3.8+ |
| DNS | dnspython 2.3+, tldextract 3.1+ |
| Data Science | pandas 1.5+, numpy 1.24+ |
| Machine Learning | scikit-learn 1.3+ |
| Visualisation | matplotlib 3.6+, seaborn 0.12+ |
| Interface graphique | PyQt5 5.15+ |
| Utilitaires | tqdm 4.64+, regex 2021.11+ |
| Tests | pytest 7.0+ (optionnel) |
- MVC (Model-View-Controller) pour l'interface graphique
- CLI (Command-Line Interface) pour les scripts
- Multiprocessing pour la parallélisation
- Pickle pour la sérialisation des modèles
- CSV - Dumps DNS, résultats d'analyse
- JSON - Exports et configuration
- Pickle - Modèles ML, sets, dictionnaires
- Markdown - Documentation
- Support des enregistrements DNS supplémentaires (A, AAAA, MX, NS)
- Export des rapports en PDF
- Interface web (Flask/Django)
- API REST pour intégration externe
- Modèles ML supplémentaires (Random Forest, XGBoost, Neural Networks)
- Apprentissage en ligne (online learning)
- Analyse temporelle (évolution des domaines dans le temps)
- Clustering de domaines similaires
- Analyse de contenu web complet (HTML, JS, CSS)
- Corrélation avec d'autres sources (WHOIS, certificats SSL, contenu)
- Système de réputation dynamique
- Intégration avec MISP (Malware Information Sharing Platform)
Nous accueillons les contributions de la communauté ! Voici comment participer :
- Fork le repository
- Créer une branche pour votre fonctionnalité (
git checkout -b feature/AmazingFeature) - Commiter vos changements (
git commit -m 'Add some AmazingFeature') - Push vers la branche (
git push origin feature/AmazingFeature) - Ouvrir une Pull Request
- Amélioration du modèle ML (nouvelles features, algorithmes)
- Ajout d'expressions régulières pour nouvelles catégories
- Correction de bugs
- Documentation
- Tests
- Traductions
Nous suivons un code de conduite basé sur le respect mutuel et l'inclusivité. Tout comportement irrespectueux ou harcelant sera sanctionné.
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
Projet : DNS TXT Malware Detection with AI
Institution : Laboratoire d’Informatique de Grenoble (LIG)
Date : 2025
- Issues GitHub : Pour rapporter des bugs ou demander des fonctionnalités
- Documentation : Consultez le dossier
docs/pour la documentation complète - Email : morchidy33@gmail.com
Ce projet s'inspire de recherches académiques sur la sécurité DNS :
- "TXTing 101: Finding Security Issues in the Long Tail of DNS TXT Records"
- "Analyzing the DNS Cache Poisoning Attack"
- "Machine Learning for Malicious Domain Detection"
Ce projet n'aurait pas été possible sans :
- Bad Domain Archive - Source de domaines malveillants (LIG)
- Spamhaus DBL - Liste de domaines malveillants (LIG)
- Public Suffix List - Liste de suffixes publics pour l'extraction de domaines
- scikit-learn - Framework de Machine Learning
- PyQt5 - Framework d'interface graphique
- dnspython - Bibliothèque de requêtes DNS
- TXT Record : Enregistrement DNS contenant des informations textuelles arbitraires
- SPF : Sender Policy Framework - Mécanisme de validation d'emails
- DMARC : Domain-based Message Authentication, Reporting & Conformance
- DKIM : DomainKeys Identified Mail - Signature cryptographique des emails
- C2 : Command and Control - Infrastructure de contrôle de malwares
- DGA : Domain Generation Algorithm - Algorithme de génération de domaines
- AUC : Area Under Curve - Mesure de performance d'un modèle de classification
- ROC : Receiver Operating Characteristic - Courbe d'analyse des performances
Q: Le système fonctionne-t-il sans connexion Internet ?
R: Non, les requêtes DNS nécessitent une connexion Internet. Cependant, l'analyse de fichiers CSV pré-collectés peut se faire hors ligne.
Q: Puis-je utiliser ce système en production ?
R: Le système peut être utilisé en production comme outil d'aide à la décision, mais nous recommandons une validation humaine pour les décisions critiques.
Q: Combien de temps prend l'analyse d'un domaine ?
R: En moyenne 0.3-0.5 secondes par domaine (incluant la requête DNS).
Q: Le modèle peut-il être réentraîné ?
R: Oui, utilisez les scripts dans src/ml/ avec vos propres données.
Q: Les enregistrements TXT sont-ils suffisants pour détecter tous les malwares ?
R: Non, c'est un indicateur parmi d'autres. Combinez avec d'autres sources pour une analyse complète.
Développé avec passion pour améliorer la sécurité DNS
Dernière mise à jour : 1er novembre 2025


