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)。 ![pipeline](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/d162e920c1165735.png) ## 仓库结构 ``` 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, 僵尸网络检测, 可解释人工智能, 命令与控制, 域名生成算法, 异常检测, 无后门, 无监督学习, 机器学习, 深度学习, 特征工程, 网络安全, 自编码器, 论文代码, 逆向工具, 随机森林, 隐私保护