
Hybrides pipelines d'apprentissage automatique pour détecter les injections SQL dans le trafic web, combinant les modèles DistilBERT et BERT-GNN avec un entraînement adversarial et une analyse de robustesse.
| Auteur | Lilliane Linnet Musoke |
| Institution | Université de Reading, Département d'informatique |
| Programme | MSc Data Science and Advanced Computing |
| Superviseur | Professeur Atta Badii |
| Soumis | 17 septembre 2024 |
Deux nouveaux pipelines hybrides d'apprentissage automatique, chacun implémenté sous forme de notebook Jupyter autonome, pour détecter les attaques par injection SQL (SQLi) dans le trafic des applications web :
DistilBERT_Stacked_Ensemble_pipeline.ipynb — un pipeline d'ensemble empilé DistilBERT (méta-apprenant). Il utilise les embeddings contextuels de DistilBERT comme entrée d'une pile de classifieurs ML et d'ensembles conventionnels (régression logistique, XGBoost, SVM), combinés sous un méta-apprenant à réseau de neurones. L'entraînement contradictoire est effectué avec la méthode du signe du gradient rapide (FGSM) ; les hyperparamètres sont optimisés avec Optuna.BERT_GNN_pipeline_FINAL.ipynb — un pipeline hybride BERT–réseau de neurones graphique (GNN). BERT génère des embeddings contextuels des requêtes SQL ; un GNN modélise la représentation graphique de la requête pour capturer les motifs structurels. Hyperparamètres optimisés avec Optuna.Plus le jeu de données utilisé pour entraîner et évaluer les deux pipelines :
SQL_Injection_Dataset.csv — requêtes SQL étiquetées (bénignes vs malveillantes).| Pipeline | Précision | Précision contradictoire (FGSM) | Remarques |
|---|---|---|---|
| Ensemble empilé DistilBERT | 99,81 % | 99,77 % | Approche recommandée sélectionnée ; temps d'exécution rapide |
| BERT-GNN | 99,48 % (99,67 % sur ensemble de validation exclu) | — | Compréhension structurelle supérieure ; temps d'exécution plus long (23,13 s) ; le réentraînement sur validation exclue atteint 99,67 %, voir RESULTS.md |
| Meilleure référence conventionnelle (Random Forest) | 94,47 % | — | Évaluée dans la même étude |
Les quatre métriques de performance (précision, rappel, score F1) atteignent le même chiffre principal pour les deux pipelines hybrides. Les tableaux complets par modèle, matrices de confusion, courbes ROC, courbes d'apprentissage et analyses de sensibilité figurent dans les notebooks et dans le mémoire.
La précision contradictoire de l'ensemble empilé DistilBERT de 99,77 % dépasse le résultat comparable de test contradictoire rapporté par Guan et al. (2023, Future Internet 15(4):133, DOI 10.3390/fi15040133) de 2,38 % — voir la section 4.4 du mémoire pour la comparaison complète.
.ipynb à la racine du dépôt contiennent le code complet des pipelines (chargement des données, prétraitement, embedding, entraînement, évaluation, robustesse contradictoire, analyse de sensibilité). Les sorties sont supprimées afin que les notebooks s'affichent rapidement et de manière compacte sur GitHub ; l'exécution de chaque notebook de haut en bas régénère toutes les figures.RESULTS.md présente toutes les figures (matrices de confusion, courbes ROC, courbes d'apprentissage, graphiques d'analyse de sensibilité, comparaison par modèle) sous forme de galerie consultable sans rien exécuter.results/, nommés par pipeline et par section.Testé sous Python 3.10+ avec un environnement Jupyter. Pour installer toutes les dépendances :
python -m venv .venv
source .venv/bin/activate # macOS / Linux
.venv\Scripts\activate # Windows
pip install -r requirements.txt
Ouvrez ensuite l'un des notebooks dans JupyterLab ou VS Code et exécutez les cellules de haut en bas. Chaque pipeline est entièrement autonome : chargement et prétraitement des données → extraction des embeddings → entraînement du modèle → évaluation → vérification de la robustesse contradictoire → analyse de sensibilité. Un GPU est recommandé pour l'étape d'entraînement BERT-GNN mais n'est pas requis pour l'inférence ni pour l'ensemble empilé DistilBERT.
Exigence en ressources. L'étape d'extraction des embeddings DistilBERT (et BERT) conserve simultanément en mémoire le modèle de langage et ses embeddings sur l'ensemble du jeu de données. L'exécution de bout en bout nécessite environ 6 à 8 Go de RAM libre pour le pipeline d'ensemble empilé DistilBERT et 8 à 12 Go pour BERT-GNN. Les notebooks ont été initialement développés sur Google Colab (qui fournit 12 à 16 Go et un GPU gratuit). Si vous exécutez localement sur une machine avec 8 Go de RAM totale, fermez d'abord les autres applications ou exécutez dans Colab via les liens de badge en haut de chaque notebook.
Les scripts à la racine du dépôt régénèrent l'analyse étendue rapportée dans l'article révisé sur BERT-GNN (ablation, évaluation corrigée sur validation exclue, graphe sensible à la structure, robustesse à l'obfuscation, suite de robustesse à sept tests, métriques complètes et temps d'exécution inter-modèles). Ils lisent le fichier SQL_Injection_Dataset.csv validé, écrivent leurs sorties dans results/ et mettent en cache les artefacts intermédiaires (embeddings BERT, graphes, modèles entraînés) sous .structure_work/ et .corrected_work/. Ces répertoires de cache ne sont volontairement pas suivis ; chaque script les reconstruit à partir du jeu de données et est reprenable, de sorte qu'une exécution interrompue sur une machine sans GPU peut simplement être relancée et se poursuivra.
Les scripts forment une chaîne producteur→consommateur via ces caches, exécutez-les donc dans cet ordre (chaque étape n'a besoin que du jeu de données plus des caches écrits par les étapes précédentes) :
pip install -r requirements.txt
python structure_graph_gnn.py # graphes de structure + best.json (Optuna) + résultat GNN structurel
python corrected_bertgnn_retrain.py # réentraînement sur validation exclue (graphe en chaîne) -> résultat corrigé
python extract_train_cls.py # embeddings BERT [CLS] de la partition d'entraînement (train_cls.npy)
python bert_only_ablation.py # têtes BERT uniquement sur le même ensemble de test
python obfuscation_robustness.py # entraîne + met en cache gnn_model.pt / mlp_model.pkl ; rappel d'évasion
python robustness_1_sensitivity.py # suite de robustesse à sept tests, un script chacun
python robustness_2_adversarial.py
python robustness_3_obfuscation_extended.py
python robustness_4_adaptive.py
python robustness_5_crossdataset.py
python robustness_6_significance.py
python robustness_7_calibration.py
python metrics_summary.py # tableaux complets de métriques par classe
python complexity_breakdown.py # précision par complexité de requête (Tableau 4)
python make_result_figures.py # matrices de confusion + graphiques comparatifs
python model_execution_times.py # temps d'entraînement + d'inférence sur tous les modèles
Tous les scripts résolvent leurs chemins par rapport au dépôt, utilisent une graine fixe (random_state=42) et ne nécessitent aucun argument. L'exécution sur CPU est entièrement prise en charge (un GPU accélère uniquement les étapes d'embedding et d'entraînement du GNN).
Précision attendue de la reproduction. Les nombres se reproduisent à environ ±0,1–0,2 point de pourcentage plutôt que bit pour bit. De légères variations proviennent de l'exécution CPU par rapport à GPU, du non-déterminisme de PyTorch et de l'époque d'arrêt précoce qui diffère d'une ou deux entre les exécutions. Les conclusions rapportées (le graphe n'apporte aucun gain de précision sur données propres mais améliore la robustesse à l'évasion par encodage URL, ainsi que les tests statistiques associés) sont stables bien dans cette marge.
Superviseur : Professeur Atta Badii (Université de Reading). Remerciements également au doctorant Ahmed Ashlam pour ses conseils pendant l'exécution du projet. Tous deux sont remerciés dans le mémoire.
Si vous référencez ce travail :
Musoke, L. L. (2024). Enhancing Web Application Firewall with Machine Learning for SQL Injection Detection. Mémoire de MSc, Université de Reading.
Publié sous la licence MIT.
Ce dépôt GitHub reflète la soumission originale sur le Gitlab institutionnel de l'Université de Reading : https://csgitlab.reading.ac.uk/qz820024/sql-injection-pipeline-project.
Déclaration d'œuvre originale (issue du mémoire) : « Je, Lilliane Linnet Musoke, du Département d'informatique de l'Université de Reading, atteste qu'il s'agit de mon œuvre originale, sauf dans les cas où j'ai explicitement reconnu les contributions d'autres auteurs. »