
Pipelines híbridos de machine-learning para deteção de injeção SQL em tráfego web, combinando modelos DistilBERT e BERT-GNN com treino adversarial e análise de robustez.
| Autor | Lilliane Linnet Musoke |
| Instituição | University of Reading, Department of Computer Science |
| Programa | MSc Data Science and Advanced Computing |
| Orientador | Professor Atta Badii |
| Submetido | 17 de setembro de 2024 |
Dois novos pipelines Híbridos de Machine Learning, cada um implementado como um notebook Jupyter autónomo, para deteção de ataques de Injeção SQL (SQLi) em tráfego de aplicações web:
DistilBERT_Stacked_Ensemble_pipeline.ipynb — um pipeline de Ensemble Empilhado DistilBERT (Meta-Learner). Utiliza embeddings contextuais DistilBERT como entrada para uma pilha de classificadores convencionais de ML e ensemble (Logistic Regression, XGBoost, SVM), combinados sob um meta-learner de rede neural. O treino adversarial é realizado com o Fast Gradient Sign Method (FGSM); os hiperparâmetros são ajustados com Optuna.BERT_GNN_pipeline_FINAL.ipynb — um pipeline híbrido BERT–Graph-Neural-Network. O BERT gera embeddings contextuais de consultas SQL; uma GNN modela a representação da consulta estruturada em grafo para capturar padrões estruturais. Hiperparâmetros ajustados com Optuna.Mais o conjunto de dados utilizado para treinar e avaliar ambos os pipelines:
SQL_Injection_Dataset.csv — consultas SQL rotuladas (benignas vs maliciosas).| Pipeline | Precisão | Precisão adversarial (FGSM) | Notas |
|---|---|---|---|
| Ensemble Empilhado DistilBERT | 99,81% | 99,77% | Abordagem recomendada selecionada; tempo de execução rápido |
| BERT-GNN | 99,48% (99,67% em dados retidos) | — | Compreensão estrutural superior; tempo de execução mais longo (23,13 s); re-treino com validação em dados retidos atinge 99,67%, ver RESULTS.md |
| Melhor baseline convencional (Random Forest) | 94,47% | — | Avaliado no mesmo estudo |
Todas as quatro métricas de desempenho (precisão, precision, recall, F1-score) atingem o mesmo valor principal para ambos os pipelines híbridos. Tabelas completas por modelo, matrizes de confusão, curvas ROC, curvas de aprendizagem e análises de sensibilidade estão nos notebooks e na dissertação.
A precisão adversarial do Ensemble Empilhado DistilBERT de 99,77% excede o resultado comparável de testes adversariais reportado por Guan et al. (2023, Future Internet 15(4):133, DOI 10.3390/fi15040133) em 2,38% — ver §4.4 da dissertação para a comparação completa.
.ipynb na raiz do repositório contêm o código completo dos pipelines (carregamento de dados, pré-processamento, embedding, treino, avaliação, robustez adversarial, análise de sensibilidade). As saídas foram removidas para que os notebooks sejam renderizados rapidamente e de forma leve no GitHub; executar qualquer um dos notebooks de cima a baixo regenera todas as figuras.RESULTS.md mostra todas as figuras (matrizes de confusão, curvas ROC, curvas de aprendizagem, gráficos de análise de sensibilidade, comparação por modelo) como uma galeria visualizável sem necessidade de executar nada.results/, nomeadas por pipeline e secção.Testado em Python 3.10+ com ambiente Jupyter. Para instalar todas as dependências:
python -m venv .venv
source .venv/bin/activate # macOS / Linux
.venv\Scripts\activate # Windows
pip install -r requirements.txt
Depois, abra qualquer um dos notebooks no JupyterLab ou VS Code e execute as células de cima a baixo. Cada pipeline é totalmente autónomo de ponta a ponta: carregamento e pré-processamento de dados → extração de embeddings → treino do modelo → avaliação → verificação de robustez adversarial → análise de sensibilidade. Uma GPU é recomendada para o passo de treino do BERT-GNN, mas não é necessária para inferência nem para o Ensemble Empilhado DistilBERT.
Requisito de recursos. O passo de extração de embeddings do DistilBERT (e BERT) mantém o modelo de linguagem e os embeddings de todo o conjunto de dados em memória simultaneamente. A execução de ponta a ponta necessita de aproximadamente 6–8 GB de RAM livre para o pipeline do Ensemble Empilhado DistilBERT e 8–12 GB para o BERT-GNN. Os notebooks foram originalmente desenvolvidos no Google Colab (que fornece 12–16 GB e uma GPU gratuita). Se executar localmente numa máquina com 8 GB de RAM total, feche outras aplicações primeiro ou execute no Colab através dos links de badge no topo de cada notebook.
Os scripts na raiz do repositório regeneram a análise alargada reportada no artigo revisto do BERT-GNN (ablação, avaliação corrigida em dados retidos, grafo sensível à estrutura, robustez a ofuscação, a suíte de robustez de sete testes, métricas completas e tempo de execução entre modelos). Eles leem o SQL_Injection_Dataset.csv consolidado, escrevem as suas saídas em results/ e armazenam em cache artefactos intermédios (embeddings BERT, grafos, modelos treinados) em .structure_work/ e .corrected_work/. Esses diretórios de cache são intencionalmente não rastreados; cada script reconstrói-os a partir do conjunto de dados e é retomável, pelo que uma execução interrompida numa máquina apenas com CPU pode simplesmente ser reiniciada e continuará.
Os scripts formam uma cadeia produtor→consumidor através dessas caches, por isso execute-os nesta ordem (cada passo só precisa do conjunto de dados mais as caches escritas pelos passos anteriores):
pip install -r requirements.txt
python structure_graph_gnn.py # grafos de estrutura + best.json (Optuna) + resultado GNN de estrutura
python corrected_bertgnn_retrain.py # re-treino com validação em dados retidos (grafo em cadeia) -> resultado corrigido
python extract_train_cls.py # embeddings BERT [CLS] da divisão de treino (train_cls.npy)
python bert_only_ablation.py # cabeças apenas-BERT no conjunto de teste idêntico
python obfuscation_robustness.py # treina + armazena em cache gnn_model.pt / mlp_model.pkl; recall de evasão
python robustness_1_sensitivity.py # suíte de robustez de sete testes, um script cada
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 # tabelas completas de métricas por classe
python complexity_breakdown.py # precisão por complexidade de consulta (Tabela 4)
python make_result_figures.py # matrizes de confusão + gráficos de comparação
python model_execution_times.py # tempo de treino + inferência em todos os modelos
Todos os scripts resolvem os seus caminhos relativamente ao repositório, usam uma semente fixa (random_state=42) e não requerem argumentos. A execução em CPU é totalmente suportada (uma GPU apenas acelera os passos de embedding e treino da GNN).
Precisão esperada da reprodução. Os números reproduzem-se aproximadamente com ±0,1–0,2 pontos percentuais, em vez de bit a bit. Variações menores provêm da execução em CPU versus GPU, do não-determinismo do PyTorch e da época de paragem antecipada diferir em um ou dois entre execuções. As conclusões reportadas (o grafo não acrescenta ganho de precisão em dados limpos, mas melhora a robustez à evasão por URL-encoding, e os testes estatísticos associados) são estáveis dentro dessa margem.
Orientador: Professor Atta Badii (University of Reading). Agradecimento também ao candidato a doutoramento Ahmed Ashlam pelos conselhos durante a execução do projeto. Ambos são reconhecidos na dissertação.
Se referenciar este trabalho:
Musoke, L. L. (2024). Enhancing Web Application Firewall with Machine Learning for SQL Injection Detection. Dissertação de mestrado, University of Reading.
Publicado sob a Licença MIT.
Este repositório GitHub espelha a submissão original no Gitlab institucional da University of Reading: https://csgitlab.reading.ac.uk/qz820024/sql-injection-pipeline-project.
Declaração de trabalho original (da dissertação): "Eu, Lilliane Linnet Musoke, do Department of Computer Science da University of Reading, atesto que este é o meu trabalho original, exceto nos casos em que reconheci explicitamente as contribuições de outros autores."