cybercop-arch/Malware-Analysis-with-XAI

GitHub: cybercop-arch/Malware-Analysis-with-XAI

基于 SHAP 可解释 AI 的恶意软件静态分析平台,通过 RF+XGBoost 集成模型提供带置信度的风险评分和特征级解释,解决传统杀毒引擎仅输出二元判定而无法解释原因的问题。

Stars: 0 | Forks: 0

# XAIGuard — 恶意软件分析 XAI 平台 **本项目运行在 localhost 上。目前尚未部署——模型文件(700MB+)不包含在此代码库中。本 README 记录了该系统的架构、相关说明和运行结果。** ## 演示截图 ### 仪表盘 !([仪表盘](https://raw.githubusercontent.com/cybercop-arch/Malware-Analysis-with-XAI/main/screenshots/Screenshot%202026-05-07%20105322.png)) *实时 KPI 卡片:总扫描次数、恶意、可疑、干净、已隔离、MTTD、MTTR、模型准确率。所有数值均根据扫描历史实时计算。* ### 文件扫描 — 检测到恶意软件 !([扫描恶意软件](https://raw.githubusercontent.com/cybercop-arch/Malware-Analysis-with-XAI/main/screenshots/Screenshot%202026-05-07%20111009.png)) *文件上传后,通过 RF+XGBoost 集成模型进行处理。显示判定结果、风险评分 (0–100)、置信度、字节熵和 70 引擎检测计数。* ### 管理面板 !([管理面板](https://raw.githubusercontent.com/cybercop-arch/Malware-Analysis-with-XAI/main/screenshots/Screenshot%202026-05-07%20111330.png)) *受限的管理控制台,提供完整的用户监督功能——凭据、登录活动、上传的文件、审计日志以及仅对特权管理员账户可见的基于角色的访问数据。* ### 管理员报告 !([管理员报告](https://raw.githubusercontent.com/cybercop-arch/Malware-Analysis-with-XAI/main/screenshots/Screenshot%202026-05-07%20111348.png)) *特权访问仪表盘,展示了用户凭据、登录活动、上传的工件、角色权限、保密协议 (NDA) 状态,以及仅限管理员账户访问的完整审计可见性。* ### 70 引擎模拟 !([引擎网格](https://raw.githubusercontent.com/cybercop-arch/Malware-Analysis-with-XAI/main/screenshots/Screenshot%202026-05-07%20111018.png)) *基于 SHA-256 作为种子的确定性逐文件引擎模拟。分为三个敏感度层级:激进、正常 和保守。* ### 扫描历史 !([扫描历史](https://raw.githubusercontent.com/cybercop-arch/Malware-Analysis-with-XAI/main/screenshots/Screenshot%202026-05-07%20111029.png)) *基于 SHA-256 链式审计日志。受角色控制的 CSV 导出。基于文件哈希去重。* ### 全局特征洞察 !([洞察](https://raw.githubusercontent.com/cybercop-arch/Malware-Analysis-with-XAI/main/screenshots/Screenshot%202026-05-07%20111303.png)) *来自训练期间保存的 `shap_global_importance.npy` 的首要特征重要性。模型性能基准测试。* ## 项目功能 XAIGuard 回答了安全运营 中一个至关重要的问题: 标准的防毒软件只会给出一个二元的判定结果。而 XAIGuard 可以提供: - 来自校准后集成模型的**概率分数**(0–100 风险等级) - **SHAP 解释**,展示具体是哪些 PE 特征驱动了该判定结果 - **置信带**(基于等渗回归校准的统计学依据) - **按紧急程度排序的剧本**(隔离 → 封锁 IOC → 追查横向移动) - **70 引擎检测网格**,展示哪些 AV 厂商会标记该文件 ## 模型架构 ``` Binary File (.exe / .dll / .bin) │ ▼ feature_extractor.py 31 static PE features: • Byte entropy (normalised Shannon entropy) • Section entropy (avg + max across all sections) • Virtual size ratio (unpacking signal) • Import count, import library flags (ws2_32, wininet, ntdll) • Suspicious string count (VirtualAllocEx, CreateRemoteThread etc.) • PE header fields (has_signature, has_tls, has_debug, subsystem) • File type magic bytes │ ▼ ┌─────────────────────────────────────────────┐ │ Random Forest (400 trees) │ │ CalibratedClassifierCV (isotonic) │ │ class_weight = "balanced" │ │ → p_rf (calibrated true probability) │ └──────────────────┬──────────────────────────┘ │ ┌──────────────────────────────────────┐ │ │ XGBoost (500 trees) │ │ │ learning_rate = 0.05 │ │ │ max_depth = 7 │ │ │ scale_pos_weight = 4.7 │ │ │ tree_method = "hist" │ │ │ → p_xgb │ │ └──────────────┬───────────────────────┘ └──────────┬─────────────┘ ▼ prob = p_rf × 0.35 + p_xgb × 0.65 │ ▼ prob_to_verdict() ≥ 0.85 → MALICIOUS ≥ 0.55 → SUSPICIOUS ≥ 0.20 → LIKELY CLEAN < 0.20 → CLEAN │ ▼ SHAP TreeExplainer Top-15 feature contributors per file (named, not indexed) ``` ## 训练数据集 — EMBER 2018 | 属性 | 数值 | |----------|-------| | 总训练样本数 | 721,986 | | 恶意 | 126,421 (17.5%) | | 良性 | 595,565 (82.5%) | | 测试样本数 | 200,000 | | 每个文件的特征数 | 31 (手工设计的静态 PE 特征) | | 来源 | EMBER 2018 + MalwareBazaar + Windows System32 | 类别不平衡(82.5% 为良性)反映了真实世界的 SOC 环境状况。XGBoost 通过设置 `scale_pos_weight = 595565 / 126421 = 4.71` 来对此进行补偿。 ## 真实模型结果 这些数据来自训练期间生成的 `model/metadata.json`,而非硬编码。 | 指标 | 数值 | 含义 | |--------|-------|---------| | **AUC-ROC** | **0.9931** | 99.3% 的情况下能将恶意软件排在良性软件之前 | | **F1 分数** | **0.9516** | 精确率和召回率的调和平均值 | | **误报率** | **7.96%** | 在 0.50 阈值下,每 12 个良性文件中就有 1 个被错误标记 | | **漏报率** | **2.01%** | 每 50 个恶意软件文件中会有 1 个被漏报 | | **精确率** | ~72% | 当模型判定为恶意时,有 72% 的情况是正确的 | | **召回率** | ~98% | 能够捕获每 100 个恶意软件中的 98 个 | **关于误报率的说明:** 在 0.50 阈值下为 7.96%。在 `prob_to_verdict()` 中将阈值提高到 0.65–0.70,可以在牺牲极小召回率的情况下将其降低到 ~2–3%。 ## 7 项研究挑战 本项目旨在解决恶意软件检测生产级 XAI 中的 7 个具体问题: | # | 挑战 | 状态 | 解决方案 | |---|-----------|--------|-----| | 1 | 无攻击面泄露 | ✅ 已解决 | 受角色控制的 SHAP 深度——终端用户只能看到抽象标签,而非原始特征名 | | 2 | 局部 + 全局 XAI | ✅ 已解决 | 源自 TreeExplainer 的逐文件 SHAP + 提供 `shap_global_importance.npy` 的 `/insights` 接口 | | 3 | 数据漂移与泛化 | ⚠️ 部分解决 | EMBER 2018 (160K 样本) 提供了强大的基线——漂移监控管道尚在开发中 | | 4 | 动态分析延迟 | ✅ 已解决 | 不到 3 秒完成全面静态分析——ByteEntropyHistogram 近似实现了动态加壳检测 | | 5 | 误报与上下文 | ✅ 已解决 | CalibratedClassifierCV (等渗回归) 提供真实的概率——连续的风险评分而非二元判定 | | 6 | 解释的可用性 | ✅ 已解决 | SHAP 特征名被映射为人类可读的标签——按判定结果提供按紧急程度排序的剧本 | | 7 | 日志安全与合规性 | ✅ 已解决 | 每次扫描提供真实的 SHA-256,受角色控制的 CSV 导出,3 级保留策略 | ## API 接口 ``` POST /scan Body: multipart/form-data, field "file" Returns: verdict, riskScore, prob, conf, confLow, confHigh, shap[{feature, impact, value}×15], engines[70], model{auc_roc, f1_score, fp_rate} GET /insights Returns: top_features[{feature, importance}×20] from shap_global_importance.npy + model metadata GET /health Returns: status, models_ready, features=31, model_auc ``` ## 角色系统 | 角色 | 扫描 | SHAP 名称 | 引擎网格 | 导出 CSV | 设置 | |------|------|-----------|-------------|------------|----------| | Admin | ✅ | ✅ | ✅ | ✅ | ✅ | | Security Analyst | ✅ | ✅ | ✅ | ✅ | ✅ | | Threat Hunter | ✅ | ✅ | ✅ | ✅ | ❌ | | End User | ✅ | ❌ | ❌ | ❌ | ❌ | End User(终端用户)只能看到抽象标签(如“导入模式 — 高影响”),而非原始特征名(`pe_imports_VirtualAllocEx: 0.412`)。这正是挑战 1——防止模型的攻击面通过 UI 泄露给攻击者。 ## 本地运行 **后端:** ``` cd backend pip install -r requirements.txt # 训练模型(需要 EMBER 2018 数据集) python train_model.py --ember ./ember2018 # 启动 API python api.py # → http://localhost:5000 ``` **前端:** ``` # 在 xaiguard-v5.jsx 第 458 行设置 API_URL: const API_URL = "http://localhost:5000"; # 然后使用您首选的方法(Vite, CRA, 等)进行 serve ``` **前端:** ``` cd streamlit streamlit run app.py ``` **演示账号:** ``` analyst@sec.io / analyst123 → Security Analyst admin@sec.io / admin123 → Admin hunter@sec.io / hunter123 → Threat Hunter user@example.com / user123 → End User ``` ## 关键技术决策 **为什么选择 RF + XGBoost 集成模型而不是 CNN+LSTM?** 基于 31 个手工设计特征的静态 PE 特征分析具有更好的可解释性,速度更快(耗时 <3s,而动态分析需 60–300s),并能生成经过校准的概率。CNN 需要将字节级数据转换为图像,但对于此特征空间而言,在可解释性上并无增益。 **为什么使用带有等渗回归的 CalibratedClassifierCV?** 原始随机森林 的 `predict_proba` 输出并非真实的概率——它反映的是决策树的投票比例,通常聚集在 0.4–0.6 之间。等渗回归拟合了一个单调校正函数,使得当模型输出 0.85 时,这类文件中实际上约有 85% 确实是恶意的。这使得置信带在统计学上更为诚实可靠。 **为什么选择 SHAP TreeExplainer 而不是 LIME?** 对于树模型而言,TreeExplainer 是精确的(非采样),无论特征数量如何,都能在几毫秒内运行完毕,并生成一致的解释。LIME 是近似算法,在不同的运行中对同一文件可能会给出不同的解释。 **为什么要进行确定性引擎模拟?** `simulate_engines()` 使用 `int(sha256[:8], 16)` 作为种子——相同的文件始终会产生相同的 70 引擎结果。三个敏感度层级(激进/正常/保守)反映了真实的 AV 厂商行为,例如 Kaspersky 和 ESET 会比 ClamAV 或 Baidu 更早地进行标记。 ## 项目结构 ``` backend/ ├── api.py Flask REST API — /scan, /insights, /health ├── feature_extractor.py 31 static PE features from raw bytes ├── train_model.py RF+XGBoost training on EMBER 2018 └── requirements.txt frontend/ └── xaiguard-v5.jsx React dashboard — 5 pages, role-gated, responsive streamlit/ └── app.py Streamlit port — full faithful migration model/ (excluded — 700MB+) ├── rf_calibrated.joblib Calibrated Random Forest ├── xgboost.ubj XGBoost model ├── metadata.json Real AUC-ROC, F1, FP/FN rates from training └── shap_global_importance.npy Mean |SHAP| across test set ``` ## 我学到了什么 - **经过校准的概率至关重要** —— 原始 RF 分数并非真正的概率。等渗校准将它们转化为具有统计意义的数值,使您可以真正信任它们来进行风险评估。 - **类别不平衡是导致误报率 (FP rate) 的主要因素** —— 82.5% 的良性训练数据在 0.50 阈值下会产生 7.96% 的误报。调整阈值比更改模型架构的影响更大。 - **在树模型上使用 SHAP 既精确又快速** —— 在一个拥有 31 个特征的 500 棵树的 XGBoost 模型上运行 TreeExplainer,每个文件耗时不到 10 毫秒。解释成本几乎可以忽略不计。 - **基于角色控制的 XAI 是一项真正的安全决策** —— 公开 SHAP 特征名(具体权衡了哪些导入函数)相当于给攻击者提供了一份规避检测的蓝图。为非特权用户抽象这些信息不仅是用户体验 (UX) 层面的考量,更是威胁建模的一部分。 - **Streamlit 会独立封装每个组件** —— 您不能将 Streamlit 组件包裹在 HTML `
` 标签中。在 Streamlit 的虚拟 DOM 中,div 会渲染,但组件会出现在它们之外。所有布局必须使用 `st.columns()`。 *基于 Flask · scikit-learn · XGBoost · SHAP · React · Streamlit · EMBER 2018 构建*
标签:Apex, DAST, DNS 反向解析, Kubernetes, Python, XAI, XGBoost, 仪表盘, 可解释人工智能, 威胁情报, 开发者工具, 引擎模拟, 恶意软件分析, 搜索语句(dork), 文件扫描, 无后门, 无线安全, 本地部署, 机器学习, 沙箱, 管理员面板, 系统架构, 网络安全, 自定义DNS解析器, 逆向工具, 随机森林, 隐私保护, 集成学习, 风险评分