nyymuudi/evasion-arms-race
GitHub: nyymuudi/evasion-arms-race
该项目研究在严格现实约束下,攻击者能否通过仅修改可控特征来规避基于 ML 的网络入侵检测器,并将此构建为检测器与攻击者之间的对抗博弈。
Stars: 0 | Forks: 0
# 对抗规避军备竞赛
**针对基于 ML 的网络入侵检测的对抗性规避,被构建为检测器与攻击者之间的一场单挑博弈。**
对抗规避军备竞赛研究的是一个单一而尖锐的问题:*攻击者能否修改恶意网络流量,使得 ML 入侵检测器将其误分类为良性流量——同时保持攻击仍然有效且流量符合协议合法性?* 这是一场单挑的军备竞赛:检测器和攻击者隔桌相对,彼此相互适应。检测器读取信号(流特征);攻击者控制其发出的信号,同时不暴露自己的底牌(功能性攻击)。在你实际控制的硬性约束下,优化对手决策边界之下的*可观测*信号,无论这张桌子代表的是扑克还是网络,其底层结构都是相同的。
## 为什么这不只是“又一个对抗性 ML 演示”
大多数规避工作会对任何能降低分类器分数的特征进行扰动,包括攻击者在现实中根本无法控制的特征(服务器响应、网络侧聚合数据)。由此产生的“对抗样本”无法转化为实际流量,因此其攻击成功率纯属虚构。本项目的核心承诺是一项**可行性约束**:每个特征都根据*谁控制它*进行分区,搜索过程只能改变攻击者实际可以设置的特征,同时保留攻击的功能核心(DoS 洪水攻击必须仍然是洪水攻击)。
特征控制类别:
| 类别 | 含义 | 可扰动? |
|-------|---------|--------------|
| **Controllable (可控)** | 攻击者自身的前向时间/大小/填充/标志 | 是 |
| **Constrained (受限)** | 前向流量/速率/ TCP 参数 | 在合法范围内,具有 DoS 功能下限 |
| **Frozen (冻结)** | 后向(服务器)方向、连接级标志计数、固定服务端口 | 否 — 重置为原始值 |
| **Derived (派生)** | 混合双向的聚合数据 | 绝不直接设置;根据原子特征重新计算 |
## 威胁模型
黑盒:攻击者只能查询检测器的决策,而无法获取其梯度或参数。这是最贴近现实的设定(攻击者很少拥有模型),也是难度更高的设定。
## 数据集
主要数据集:**LYCOS-IDS2017**(基于 CIC-IDS2017 PCAP 的 LycoSTand 流提取器),它修正了原始 CIC-IDS2017 CSV 中记录有案的流构建和标记错误。目标攻击类别:**DoS Hulk**(HTTP 洪水)——选择它是由于其时间/流量特征占主导地位且确实由攻击者控制,这使得保留功能核心的约束变得切实可行。支持将 CICFlowMeter 命名作为备选方案,这也是特征分区最初验证时所用的标准。
特征分区是**基于规则且由表头驱动**的:它根据名称模式对每一列进行分类,因此将 CICFlowMeter 替换为 LYCOS 只是表头的替换,不需要修改代码。任何规则无法确信分类的内容都会被提交给人工确认,绝不进行盲目猜测。
## 项目结构
```
evasion-arms-race/
├── src/evasion_arms_race/
│ ├── data/ # dataset loading, header normalisation, stratified split
│ │ └── loader.py
│ ├── features/ # the heart of Layer A — feature control model
│ │ ├── partition.py # control classes + bounds + derived recompute rules
│ │ ├── rule_classifier.py # header-driven, feature-set-agnostic classifier
│ │ └── projection.py # feasibility projection (frozen/constrained/derived)
│ ├── detector/ # baseline IDS the attack evades (PR-AUC, temporal eval)
│ │ └── baseline.py
│ ├── attack/ # black-box evasion search calling project() each step
│ │ └── blackbox.py
│ ├── metrics/ # evasion success rate, perturbation size, query budget
│ │ └── evasion.py
│ └── validation/ # pcap-level realisability check (resolves aggregates)
│ └── realisability.py
├── configs/ # experiment configs (dataset paths, target class, budgets)
├── tests/ # pytest suite; projection pipeline is fully validated
├── scripts/ # CLI entrypoints (download, preprocess, train, attack)
├── notebooks/ # exploratory analysis (not part of the reproducible path)
├── experiments/ # run outputs (gitignored)
├── data/{raw,processed,artifacts}/ # gitignored; never commit captures
├── docs/
├── pyproject.toml
└── README.md
```
## 路线图
本项目分为三个雄心逐层递进的层级进行构建。
**A 层 — 规避**(*进行中*)。攻击者在可行性 + 功能性约束下规避固定的检测器。
- [x] (1) 固定威胁模型:黑盒
- [x] (2) 将特征划分为控制类别 — 已泛化为表头驱动的规则分类器
- [x] (3) 可行性投影 — 已验证、幂等、与源无关
- [x] (4) 功能核心保留 — 内置于投影中(DoS 下限)
- [x] (5) 每步调用投影的黑盒搜索算法 — 投影式、基于决策的边界攻击
- [x] (6) 指标模块:成功率与扰动幅度的权衡曲线、三类结果分解、单特征移动量与检测器依赖度的对比
- [ ] (7) pcap 级别的可实现性验证(解决不可重建的聚合数据)
**B 层 — 毒化**。攻击者毒化检测器的再训练数据;量化导致检测能力崩溃的毒化阈值。
**C 层 — 鲁棒防御 + 博弈论分析**。对抗训练,然后将攻击/再训练循环明确建模为一场博弈,研究其是收敛于均衡状态还是持续震荡。
## 设置
```
git clone https://github.com/nyymuudi/evasion-arms-race.git
cd evasion-arms-race
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest -q # the feasibility pipeline should pass out of the box
```
## 当前状态
A 层的第 1 至 6 项已完成并经过测试。可行性流水线通过规则分类器精确重现了手动构建的特征分区,严格执行了冻结/受限/派生约束,保留了 DoS 功能核心,并且具备幂等性。黑盒攻击(第 5 项)是一种带有随机重启初始化的、投影式的、基于决策的**边界攻击**:它在每个候选点上都会调用可行性投影,因此每个被查询的点都能保持为可实现的流量,并且在两个基线检测器上运行效果完全一致。搜索空间仅包含可控 + 受限特征;扰动幅度是在检测器缩放空间中的可控特征上报告的。
核心发现(DoS-Hulk 样本,1200 次查询预算):**两个检测器均被 100% 成功规避**。区别在于成本而非成功率——Random Forest(随机森林)需要更多的查询(随着预算增加,它逐渐攀升至 100%,而 logistic regression 几乎立即饱和),并且通常需要更大的扰动。早先基于消融实验得出 Random Forest 能够*抵抗*攻击的预期,在与实际攻击接触后宣告破灭:分类鲁棒性(特征消融下的 PR-AUC)并不等同于受可行性约束搜索下的对抗鲁棒性。对 Random Forest 的规避是否对应于**物理上可实现的**流——还是仅仅利用了森林在其训练支持之外的任意外推——这正是 pcap 级别的可实现性检查(第 7 项)必须解决的问题。
指标模块(第 6 项,`python -m evasion_arms_race.metrics.report`)将单样本结果转化为四个可报告的产出:(1) **成功率与扰动的权衡曲线**(成功率作为允许的可控 L2 范数的函数,绝不是单一数值);(2) **三类结果随查询预算的分解** — 成功 / `feasibility_bound`(DoS 下限阻止了扰动) / `detector_bound`(检测器在可移动子空间上进行了抵抗);(3) 成功规避的**单特征移动量**与检测器权重最高的特征进行对比;(4) 在每张图表上对比 logistic regression 与 Random Forest。有两个发现值得注意:在这些预算下,DoS 下限很少*终止*攻击,然而它会回退很大一部分单个标签翻转(报告量化了单步拦截率)——它提高了成本但未能阻止规避;此外,检测器权重最高的特征大多是**不可移动的**(后向/派生),而对 Random Forest 的规避*没有*移动其前 10 大特征中的任何一个——攻击利用的是可移动的相关特征,而不是检测器所声明的信号。图表会生成在 `experiments/figures/` 目录下(已被 gitignore 忽略);数值摘要保存在 `experiments/evasion_metrics.json` 中(受版本控制)。
五个 CICFlowMeter 聚合特征(数据包长度统计)被标记为仅凭 CSV 聚合数据*无法重建*,并推迟至第 7 项的 pcap 级别验证中处理;LYCOS 更丰富的特征集可能允许对其进行精确的重新计算。
## 关于完整性的说明
- 仅进行诚实评估:使用 PR-AUC 而非准确率。当前的数据集划分是分层随机抽样;时间序列划分(用于使概念漂移可见)需要带有时间戳的 GeneratedLabelledFlows 发行版,目前已被推迟,而不是盲目假设。
- 可行性约束是本项目存在的理由;为了追求更高的规避率而放宽该约束将使结果毫无意义。
- 针对已知的 CIC-IDS2017 数据质量问题,本项目优先采用经过修正的 LYCOS-IDS2017 提取数据来加以处理。
标签:DNS 反向解析, 安全规则引擎, 对抗样本, 网络安全, 网络流量分析, 逃逸攻击, 逆向工具, 隐私保护, 黑盒攻击