Fleria/xai-dga-detection
GitHub: Fleria/xai-dga-detection
结合深度自编码器与 SHAP 可解释性分析的无监督 DGA 域名检测框架,无需标注数据即可识别僵尸网络通信并解释决策依据。
Stars: 0 | Forks: 0
# 基于可解释 AI 的无监督 DNS 僵尸网络检测器中的特征工程
本仓库包含随附论文的代码和模型:
## 概述
僵尸网络依赖域名生成算法 (DGA) 生成大量域名,其中仅有小部分会解析到命令与控制 (C&C) 服务器。本研究提出了一种无监督、可解释的框架,用于检测 DGA 生成的域名,从而避免了需要标注训练数据的问题。
核心流程包含四个阶段:
1. **预处理** — 剥离 DNS 后缀,去除重复项,并从域名前缀中提取统计和语言学特征。
2. **模型调优** — 在良性 Tranco 域名上训练深度自编码器。重建误差高于阈值的域名将被标记为 DGA。
3. **可解释性** — 应用 SHAP (Kernel Explainer) 全局(条形图)和局部(力导向图)解释模型决策。
4. **特征增强** — 使用基于 SHAP 的特征重要性来重新构建特征集,并重新训练改进后的模型 (V2)。

## 仓库结构
```
xai-dga-detection/
│
├── Data/
│ ├── preprocessing.py # Strips DNS suffixes, extracts unique prefixes
│ ├── prefixes_tranco.csv # Benign domain prefixes (Tranco top 2M)
│ ├── prefixes_merged_10000.csv # Merged benign/DGA subset
│ ├── merged_10000.csv # Full merged dataset
│ └── .csv # Per-family DGA name CSVs (15 DGA families)
│
├── saved_autoencoder_models/
│ ├── autoencoder_[49, 45, 35, 25, 15].keras # V1 model (49 features)
│ └── autoencoder_[52, 45, 35, 25, 15].keras # V2 model (52 features)
│
├── supervised_models/
│ ├── rf_model.ipynb # Random Forest baseline
│ └── xgboost_model.ipynb # XGBoost baseline
│
├── saved_excels/
│ ├── results_accuracy.xlsx # Per-model accuracy metrics
│ └── results_final.xlsx # Summary results table
│
├── v1_model_training.ipynb # Train V1 autoencoder (49 features)
├── v2_model_training.ipynb # Train V2 autoencoder (52 features, augmented)
├── performance_testing_v1.ipynb # Evaluate V1 + SHAP analysis
├── performance_testing_v2.ipynb # Evaluate V2 + SHAP analysis (FP/FN force plots)
├── plot_visualization.ipynb # Generate V1 vs V2 comparison bar plots
└── requirements.txt
```
## 数据集
| 数据集 | 来源 | 作用 |
|---|---|---|
| Tranco Top 2M | [tranco-list.eu](https://tranco-list.eu) | 良性训练与测试 |
| DGArchive | [Fraunhofer FKIE](https://dgarchive.caad.fkie.fraunhofer.de) | DGA 评估(15 个家族) |
DGArchive 的访问权限可向 Fraunhofer FKIE 申请获取。Tranco 列表于 2025 年 7 月下载。
实验中使用的数据集划分如下:
- **训练集**:80 万个良性域名 (40%)
- **验证集**:40 万个良性域名 (20%)
- **测试集**:80 万个良性域名 + 266,377 个 DGA 域名
## 特征
### 初始特征集 — V1(49 个特征)
| 索引 | 特征 | 描述 |
|---|---|---|
| 1 | Length | 字符数量 |
| 2 | Entropy | Shannon 熵 |
| 3 | Num_DeciDig | 十进制数字计数 |
| 4 | Num_Letters | 字母 A–Z 计数 |
| 5 | Num_Vowels | 元音字母计数 |
| 6 | Num_Words | 有意义的单词计数 (WordNinja) |
| 7 | Num_Special_Chars | `.` 和 `-` 计数 |
| 8 | Max_Letter_Seq | 最长连续字母序列 |
| 9 | Freq_DeciDig | 数字频率 (Num_DeciDig / Length) |
| 10 | Freq_Vowel | 元音频率 (Num_Vowels / Length) |
| 11 | Freq_Special_Chars | 特殊字符频率 |
| 12 | Words_Mean_Len | 有意义单词的平均长度 |
| 13 | Reputation | 良性 N-gram 计数 (N = 3..7) |
| 14–49 | Num_A – Num_Z, Num_0 – Num_9 | 单个字符频率 |
### 增强特征集 — V2(52 个特征,新增 3 个)
| 索引 | 特征 | 描述 |
|---|---|---|
| 50 | Max_DeciDig_Seq | 最长连续数字序列 |
| 51 | First_Letter_Digit | 布尔值:名称是否以数字开头? |
| 52 | Hex_Chars | 十六进制字符 [0–9, A–F] 计数 |
这 3 个附加特征的提出是基于对 V1 的 SHAP 分析,该分析揭示了与数字相关的特征主导了分类决策。
## 结果
### AutoEncoder 性能 (V1 与 V2)
| 模型 | 准确率 | F1 分数 |
|---|---|---|
| V1(阈值 0.001252) | 89.65% | 76.64% |
| V2(阈值 0.00085) | **91.86%** | **84.37%** |
V2 将假阴性(漏报的 DGA 域名)减少了 **62.75%**(54,268 → 25,147)。
### 与监督基线模型的比较
| 模型 | 准确率 | F1 分数 |
|---|---|---|
| XGBoost | 98.90% | 95.29% |
| Random Forest | 97.87% | 90.28% |
| AE V2 (无监督) | 91.86% | 84.37% |
监督模型的表现优于 V2,但需要完全标注的训练数据。AE 方法能够在无标签的情况下泛化到新型的 DGA 家族。
## 设置
```
git clone https://github.com//xai-dga-detection.git
cd xai-dga-detection
python -m venv venv
venv\Scripts\activate # Windows
pip install -r requirements.txt
```
主要依赖项:`tensorflow`、`scikit-learn`、`xgboost`、`shap`、`wordninja`、`pandas`、`numpy`、`matplotlib`、`seaborn`、`openpyxl`。
## 用法
按以下顺序运行 Notebook:
1. **`Data/preprocessing.py`** — 预处理原始 CSV 文件以提取域名前缀。
2. **`v1_model_training.ipynb`** — 训练 V1 AutoEncoder 并将其保存到 `saved_autoencoder_models/`。
3. **`performance_testing_v1.ipynb`** — 评估 V1 并计算 SHAP 值;检查特征重要性条形图。
4. **`v2_model_training.ipynb`** — 使用 3 个附加特征训练增强的 V2 AutoEncoder。
5. **`performance_testing_v2.ipynb`** — 评估 V2 并为 FP/FN 实例生成 SHAP 力导向图。
6. **`plot_visualization.ipynb`** — 直观地比较 V1 和 V2 的分类结果。
7. **`supervised_models/rf_model.ipynb`** 和 **`supervised_models/xgboost_model.ipynb`** — 训练和评估监督基线模型。
## 模型架构
表现最好的 AutoEncoder(AE 3,通过对 6 种架构进行网格搜索,根据最高 F1 分数选出):
```
Input (49) → 45 → 35 → 25 → 15 → Bottleneck (10) → 15 → 25 → 35 → 45 → Output (49)
```
超参数:200 个 epoch,批大小为 64,Adam 优化器,二元交叉熵损失,ReLU 激活函数(隐藏层),Sigmoid(输出层)。训练在配备 8 个虚拟核心和 24 GB RAM 的虚拟机上的 CPU 上执行——无需 GPU。
经过基于 SHAP 的特征增强后,输入层和镜像输出层特征发生变化,以反映增强后的特征集:
```
Input (52) → 45 → 35 → 25 → 15 → Bottleneck (10) → 15 → 25 → 35 → 45 → Output (52)
```
## 引用
```
@ARTICLE{11493868,
author = {Arkadopoulou, Eleftheria and Kostopoulos, Nikos and Grammatikou, Maria and Maglaris, Vasilis},
journal = {IEEE Access},
title = {Feature Engineering in Unsupervised DNS Botnet Detectors Based on eXplainable AI},
year = {2026},
volume = {14},
pages = {64220-64230},
doi = {10.1109/ACCESS.2026.3687021}
}
```
## 致谢
- DGArchive 的访问权限由 **Fraunhofer FKIE** 的网络分析与防御部门提供。
标签:Apex, AutoEncoder, C2检测, DGA检测, DNS安全, Keras, Python, SHAP, XAI, XGBoost, 僵尸网络检测, 可解释人工智能, 命令与控制, 域名生成算法, 异常检测, 无后门, 无监督学习, 机器学习, 深度学习, 特征工程, 网络安全, 自编码器, 论文代码, 逆向工具, 随机森林, 隐私保护