
Pipeline di machine learning ibrido per il rilevamento di SQL injection nel traffico web, che combinano i modelli DistilBERT e BERT-GNN con training avversario e analisi della robustezza.
| Autore | Lilliane Linnet Musoke |
| Istituzione | University of Reading, Dipartimento di Informatica |
| Programma | MSc Data Science and Advanced Computing |
| Supervisore | Professor Atta Badii |
| Presentata | 17 settembre 2024 |
Due nuove pipeline ibride di Machine Learning, ciascuna implementata come notebook Jupyter autonomo, per il rilevamento degli attacchi di SQL Injection (SQLi) nel traffico delle applicazioni web:
DistilBERT_Stacked_Ensemble_pipeline.ipynb — una pipeline DistilBERT-Stacked Ensemble (Meta-Learner). Utilizza gli embedding contestuali di DistilBERT come input per uno stack di classificatori ML convenzionali e ensemble (Logistic Regression, XGBoost, SVM), combinati sotto un meta-learner basato su rete neurale. L'addestramento avversariale viene eseguito con il Fast Gradient Sign Method (FGSM); gli iperparametri vengono ottimizzati con Optuna.BERT_GNN_pipeline_FINAL.ipynb — una pipeline ibrida BERT–Graph-Neural-Network. BERT genera embedding contestuali delle query SQL; una GNN modella la rappresentazione della query come struttura a grafo per catturare i pattern strutturali. Iperparametri ottimizzati con Optuna.Più il dataset utilizzato per addestrare e valutare entrambe le pipeline:
SQL_Injection_Dataset.csv — query SQL etichettate (benigne vs dannose).| Pipeline | Accuratezza | Accuratezza avversariale (FGSM) | Note |
|---|---|---|---|
| DistilBERT-Stacked Ensemble | 99,81% | 99,77% | Approccio raccomandato selezionato; tempi di esecuzione rapidi |
| BERT-GNN | 99,48% (99,67% su held-out) | — | Comprensione strutturale superiore; tempi di esecuzione più lunghi (23,13 s); il riaddestramento su validazione held-out raggiunge il 99,67%, vedi RESULTS.md |
| Migliore baseline convenzionale (Random Forest) | 94,47% | — | Valutata nello stesso studio |
Tutte e quattro le metriche di performance (accuratezza, precisione, recall, F1-score) raggiungono lo stesso valore principale per entrambe le pipeline ibride. Le tabelle complete per modello, le matrici di confusione, le curve ROC, le curve di apprendimento e le analisi di sensibilità sono nei notebook e nella tesi.
L'accuratezza avversariale del DistilBERT-Stacked Ensemble del 99,77% supera il risultato comparabile di test avversariale riportato da Guan et al. (2023, Future Internet 15(4):133, DOI 10.3390/fi15040133) del 2,38% — vedi la sezione §4.4 della tesi per il confronto completo.
.ipynb nella radice del repository contengono il codice completo delle pipeline (caricamento dati, preprocessamento, embedding, addestramento, valutazione, robustezza avversariale, analisi di sensibilità). Gli output sono stati rimossi affinché i notebook vengano visualizzati rapidamente e in modo leggero su GitHub; eseguendo uno dei due notebook dall'inizio alla fine si rigenerano tutte le figure.RESULTS.md mostra tutte le figure (matrici di confusione, curve ROC, curve di apprendimento, grafici dell'analisi di sensibilità, confronto per modello) come galleria consultabile senza dover eseguire nulla.results/, denominate per pipeline e sezione.Testato con Python 3.10+ in ambiente Jupyter. Per installare tutte le dipendenze:
python -m venv .venv
source .venv/bin/activate # macOS / Linux
.venv\Scripts\activate # Windows
pip install -r requirements.txt
Quindi aprire uno dei notebook in JupyterLab o VS Code ed eseguire le celle dall'inizio alla fine. Ogni pipeline è completamente autonoma: caricamento e preprocessamento dei dati → estrazione degli embedding → addestramento del modello → valutazione → verifica della robustezza avversariale → analisi di sensibilità. Una GPU è consigliata per la fase di addestramento BERT-GNN ma non è necessaria per l'inferenza né per il DistilBERT-Stacked Ensemble.
Requisiti di risorse. La fase di estrazione degli embedding di DistilBERT (e BERT) mantiene in memoria simultaneamente il modello linguistico e gli embedding dell'intero dataset. L'esecuzione end-to-end richiede circa 6–8 GB di RAM libera per la pipeline DistilBERT-Stacked Ensemble e 8–12 GB per BERT-GNN. I notebook sono stati originariamente sviluppati su Google Colab (che fornisce 12–16 GB e una GPU gratuita). Se si esegue in locale su una macchina con 8 GB di RAM totale, chiudere prima le altre applicazioni oppure eseguire su Colab tramite i link badge in cima a ciascun notebook.
Gli script nella radice del repository rigenerano l'analisi estesa riportata nell'articolo BERT-GNN revisionato (ablation, valutazione held-out corretta, grafo sensibile alla struttura, robustezza all'offuscamento, suite di robustezza a sette test, metriche complete e tempi di esecuzione tra modelli). Leggono il file SQL_Injection_Dataset.csv incluso, scrivono i loro output in results/ e memorizzano nella cache gli artefatti intermedi (embedding BERT, grafi, modelli addestrati) sotto .structure_work/ e .corrected_work/. Queste directory di cache non sono volutamente tracciate; ogni script le ricostruisce dal dataset ed è ripristinabile, quindi un'esecuzione interrotta su una macchina solo CPU può semplicemente essere riavviata e continuerà.
Gli script formano una catena produttore→consumatore attraverso queste cache, quindi eseguirli in questo ordine (ogni passaggio richiede solo il dataset più le cache scritte dai passaggi precedenti):
pip install -r requirements.txt
python structure_graph_gnn.py # grafi strutturali + best.json (Optuna) + risultato struttura-GNN
python corrected_bertgnn_retrain.py # riaddestramento su validazione held-out (grafo a catena) -> risultato corretto
python extract_train_cls.py # embedding BERT [CLS] della suddivisione di addestramento (train_cls.npy)
python bert_only_ablation.py # sole testate BERT sullo stesso set di test
python obfuscation_robustness.py # addestra e memorizza nella cache gnn_model.pt / mlp_model.pkl; recall di evasione
python robustness_1_sensitivity.py # suite di robustezza a sette test, uno script ciascuno
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 # tabelle complete delle metriche per classe
python complexity_breakdown.py # accuratezza per complessità della query (Tabella 4)
python make_result_figures.py # matrici di confusione + grafici di confronto
python model_execution_times.py # tempi di addestramento + inferenza su tutti i modelli
Tutti gli script risolvono i propri percorsi relativamente al repository, utilizzano un seed fisso (random_state=42) e non richiedono argomenti. L'esecuzione su CPU è pienamente supportata (una GPU accelera solo i passaggi di embedding e addestramento della GNN).
Precisione attesa della riproduzione. I numeri si riproducono con una precisione approssimativa di ±0,1–0,2 punti percentuali piuttosto che bit per bit. Piccole variazioni derivano dall'esecuzione su CPU rispetto a GPU, dalla non-determinismo di PyTorch e dall'epoca di early stopping che differisce di uno o due tra le esecuzioni. Le conclusioni riportate (il grafo non aggiunge guadagno in accuratezza pulita ma migliora la robustezza all'evasione tramite URL-encoding, e i relativi test statistici) sono stabili ben all'interno di quel margine.
Supervisore: Professor Atta Badii (University of Reading). Ringraziamento anche al dottorando Ahmed Ashlam per i consigli durante l'esecuzione del progetto. Entrambi sono ringraziati nella tesi.
Se si fa riferimento a questo lavoro:
Musoke, L. L. (2024). Enhancing Web Application Firewall with Machine Learning for SQL Injection Detection. Tesi di laurea magistrale, University of Reading.
Rilasciato sotto la Licenza MIT.
Questo repository GitHub rispecchia la presentazione originale sul Gitlab istituzionale della University of Reading: https://csgitlab.reading.ac.uk/qz820024/sql-injection-pipeline-project.
Dichiarazione di opera originale (dalla tesi): "Io, Lilliane Linnet Musoke, del Dipartimento di Informatica della University of Reading, attesto che questa è la mia opera originale, eccetto per quei casi in cui ho esplicitamente riconosciuto i contributi di altri autori."