seyifalode-cmd/operation-forager-detection-lab
GitHub: seyifalode-cmd/operation-forager-detection-lab
一个基于Python标准库从零搭建的AI增强检测工程实验室,模拟无恶意软件身份入侵并验证行为检测规则的有效性。
Stars: 0 | Forks: 0
# FORAGER 行动 — AI 增强的检测工程实验室
**从零开始构建检测工程实验室**
Oluwaseyi Michael Falode | 网络安全与云安全工程师 | 多伦多,安大略省 | 2026年5月





一个从头到尾亲手搭建的检测工程实验室 — 没有付费工具,没有预构建的技术栈,没有捷径。该实验室模拟了一次针对虚构公司的、真实的**无恶意软件**入侵,生成该入侵会留下的日志数据,然后构建并验证能捕捉攻击每个阶段的检测规则。它以一个反映行业未来走向的练习作为结束:由人类分析师来验证一个存在缺陷的 AI 分诊管道的结论。
**核心结果:** 四个攻击阶段。四个行为检测。在包含 51,225 个合成日志事件的标注数据集中,**4/4 全部被检测出,且 0 误报** — 所有这一切都运行在 Python 标准库上,无需任何付费工具。
## 项目概览
| | |
|---|---|
| **语言** | Python 3(仅使用标准库 — 零外部依赖) |
| **日志来源** | Web 流量 · 云身份(审计 + 登录)· 云控制平面 |
| **总事件数** | 51,225 个带有隐藏真实标签的合成日志事件 |
| **攻击阶段** | 8 个阶段 — 从凭证填充到数据外泄 |
| **已构建的检测** | 4 个(IDNT-002, CLD-004, CLD-005, CLD-006) |
| **检测类型** | 关联 · 单事件 · 阈值(独立计数) |
| **验证结果** | 4/4 真阳性 · 0 误报 |
| **威胁行为者模型** | FORAGER — 聚焦身份,无恶意软件,基于 Scattered Spider / Lapsus$ |
| **框架** | MITRE ATT&CK · 检测工程 · SOAR · 人在回路(Human-in-the-Loop)的 AI 验证 |
| **附加内容** | 威胁行为者画像 · 两份 IR playbook · AI 分诊模拟器 |
## 为什么会有这个项目
大多数安全分析师都能谈论检测工程。但很少有人能展示它是如何运作的,并用数据说话。这个实验室证明了完整的能力:选取一次攻击,了解它在不同日志来源中留下的痕迹,编写捕捉它的逻辑,并衡量该逻辑是否有效且不会狼来了(误报)。
攻击者(FORAGER)是刻意基于现代专注于身份的威胁组织建模的,这些组织依赖社会工程和被盗身份而不是恶意软件。没有需要封锁的文件哈希,也没有固定的恶意 IP 地址。这一个设计选择迫使所有的检测都必须是行为检测 — 捕捉攻击者**做了什么**,而不是他们使用了什么工具。这才是当今至关重要的技能。
## 场景设定
目标是一个拥有数百万客户账户的虚构消费平台,其企业身份由云身份提供商管理,生产系统运行在公有云中。FORAGER 执行了八个阶段的入侵,从首次攻陷到窃取数据,大约耗时三小时。
| 阶段 | 技术 | MITRE ATT&CK | 检测者 |
|---|---|---|---|
| 1 | 凭证填充 — 40,000 次尝试,900 个轮换 IP | T1110.004 | (范围) |
| 2 | 欺诈噪声 — 被劫持的账户用作诱饵 | T1078 | (范围) |
| 3 | 服务台语音钓鱼 — 社会工程学 MFA 重置 | T1656 冒充 | **IDNT-002** |
| 4 | 满足 MFA 的登录 — 攻击者控制已注册设备 | T1621 | **IDNT-002** |
| 5 | 云侦察 — 枚举 IAM、S3、EC2、RDS、Lambda | T1580 | **CLD-006** |
| 6 | 持久化 — 休眠服务账户上的访问密钥 | T1098.001 | **CLD-004** |
| 7 | 防御规避 — 禁用 CloudTrail | T1562.008 | **CLD-005** |
| 8 | 数据外泄 — 批量读取 S3 客户记录 | T1530 | (规避后盲区) |
检测内容的全部工作是在第 3 阶段就抓住攻击者,而不是等到第 8 阶段。
## 阶段 1:工作区设置
项目的组织方式与真实的检测仓库一样 — 为攻击叙事、数据生成器、检测规则、验证工具、威胁情报、IR playbook 和 AI 练习分别设立了单独的文件夹。所有操作都从确认了 Python 安装的干净目录中运行。

*截图 1 — 从零开始创建工作区,确认了 Python 环境,并将攻击叙事作为第一个工件编写 — 计划始终先于代码*
## 阶段 2:生成遥测数据
如果没有可运行的数据,检测就毫无价值。三个生成器生成真实的日志 — 即入侵会留下的数字足迹 — 其中攻击事件按照真实世界的比例被故意掩埋在合法的后台活动中。每个事件都带有一个隐藏的 `__label__` 字段用于评分。
**生成的日志来源:**
| 来源 | 文件 | 事件数 | 恶意 |
|---|---|---|---|
| Web 流量 | `data/web_logs.jsonl` | ~51,200 | 40,000 填充 + 1,200 欺诈 |
| 身份审计 + 登录 | `data/identity_logs.jsonl` | ~527 | 2(掩埋在 525 条合法记录中) |
| 云控制平面 | `data/cloud_logs.jsonl` | ~858 | 57(侦察 + 持久化 + 规避 + 外泄) |
### Web 日志生成器 — 设计细节
40,000 次攻击尝试仅分布在 900 个 IP 地址上,模拟轮换代理池。这正是使得凭证填充难以被简单的单 IP 速率规则捕获的原因 — 每个单独 IP 的单 IP 速率都低于阈值,但整个池的总容量和 401 比率却是显而易见的。

*截图 2 — Web 日志生成器:40,000 次攻击分布在 900 个 IP 上,以模拟轮换代理池*

*截图 3 — 所有三个日志来源均已生成并验证。搜索隐藏标签暴露了攻击者的两个身份操作 — 一次 MFA 重置和一次设备注册,两者相隔 29 分钟*
## 阶段 3:编写检测规则
四个检测,每个针对不同的攻击阶段,每个采用不同的结构类型。每条规则都被记录了两次:一次是作为 SIEM 查询语言编写的 SIEM 查询,另一次是作为针对数据集执行的可运行 Python 代码,以便证明其逻辑。
### IDNT-002 — 身份接管(关联规则)
**类型:** 关联 — 两个事件,同一个行为者,短时间窗口
最重要的检测。单个服务台的 MFA 重置是完全正常的。单个设备注册也是正常的。攻击的特征在于这两个事件在 60 分钟的时间窗口内,按顺序发生在同一个人身上。这是一个关联规则 — 它基于跨多个事件的模式触发,而不是任何一个单一事件。
```
# 核心逻辑:按用户对 audit events 进行分组,查找 reset → registration 配对
for user in resets:
if user not in registrations:
continue
gap = (registrations[user] - resets[user]).total_seconds()
if gap > 0 and gap <= 3600:
fire_alert(user, resets[user], registrations[user])
```
在数据集中的 25 次合法重置中,该规则正确地忽略了每一次,并且仅在攻击者身上触发。

*截图 4 — 一条有文档说明的检测规则:顶部是 SIEM 查询,接着是对每一行的浅显易懂的解释,最后是关于如何在不使规则致盲的情况下减少误报的调优说明*

*截图 5 — IDNT-002 运行中:从噪声中揪出攻击者的账户,报告相隔 29 分钟的重置和注册 — 对所有 25 次无辜的重置保持静默*
### CLD-006 — 侦察爆发(阈值规则)
**类型:** 独立计数 — 每个身份在每 10 分钟窗口内执行的唯一枚举命令数量
单个枚举命令并不可疑。`ListBuckets`、`DescribeInstances` 在正常自动化中运行。信号在于广度:一个身份,许多不同的资源类型,快速连续发生。这种模式描述了攻击者在首次访问后对环境进行测绘的行为。
```
# 在 sliding window 中统计每个 actor 的不同 enumeration 命令数量
for actor, events in actor_events.items():
for start_time, _ in events:
window_cmds = {action for time, action in events
if start_time <= time < start_time + timedelta(minutes=10)}
if len(window_cmds) >= 5:
fire_alert(actor, window_cmds)
```

*截图 6 — CLD-006 在 Python 中:收集每个身份的独立枚举命令,当一个身份跨越 5 个独立命令的阈值时触发*
### CLD-004 — 访问密钥持久化(单事件 + 上下文)
**类型:** 带条件的单事件 — 在休眠目标账户上执行 `iam:CreateAccessKey`
合法的密钥轮换会通过自动化工具在活动账户上创建新密钥并删除旧密钥。而这里的这些条件一个都不满足。目标账户之前没有任何 API 活动。是一个人类身份在创建密钥。并且没有相应的删除操作。
### CLD-005 — 日志篡改(纯单事件,零容忍)
**类型:** 单事件 — 任何出现 `cloudtrail:StopLogging` 的情况
此规则永远不会被调低阈值。在正常运行期间,没有任何正当理由可以禁用云安全记录器。即使是渗透测试团队在采取此操作之前,也应该有一个预先批准的变更窗口。
### 所有四个检测触发

*截图 7 — 所有四个检测依次执行,每一个都准确地在其目标攻击阶段触发*
## 阶段 4:证明其有效
手动运行规则并用肉眼检查输出是不够的。验证工具重新实现了每条规则的逻辑,并根据隐藏的真实标签对其进行评分,从而回答对于任何检测都至关重要的两个问题:
1. 它抓住了真正的攻击吗?**(真阳性)**
2. 它对无辜活动保持安静了吗?**(无误报)**

*截图 8 — 验证工具:每条规则返回其真阳性和假阳性计数,并根据标注数据进行衡量 — 将“我写了一些规则”变成了一个可衡量的结果*

*截图 9 — 得分卡:IDNT-002、CLD-004、CLD-005 和 CLD-006 各自获得一个真阳性和零个假阳性 — FORAGER 攻击的所有四个阶段均被检测到*
## 阶段 5:验证 AI 分诊管道
行业正在向 AI 增强的安全运营发展,由自动化管道执行初步分诊,然后由人类验证其结论。这是一项真正全新的技能,几乎没有人练习过。该模拟器产生的判决以真实 AI 系统失败的具体方式表现出自信且错误的结果。
**所有三个 AI 判决都是错误的。每一个都教会了我们一个真实的教训。**

*截图 10 — AI 分诊模拟器:三个告警,三个错误的判决,每一个都展示了一种典型的 AI 失败模式*
| 案例 | AI 判决 | 失败模式 | 它漏掉了什么 |
|---|---|---|---|
| CASE-001 (IDNT-002) | "良性 — MFA 已通过" | 信任了下游信号而未检查上游上下文 | MFA 通过意味着攻击者控制了设备。AI 却从未检查过前面一步的审计追踪:是谁重置了验证因素以及何时重置的。 |
| CASE-002 (CLD-004) | "良性 — 常规密钥轮换" | 在未检查条件的情况下匹配到了标签 | 轮换 = 创建 + 删除。这里并没有删除操作。目标账户处于休眠状态AI 停留在操作名称上,从未检查任何一个条件。 |
| CASE-003 (CLD-005) | "低优先级 — 日志停止后没有事件" | 将证据的缺失误读为缺失的证据 | 事件缺失是*因为*攻击者关闭了日志。AI 关着灯在黑暗中摸索,然后报告说什么也看不见。 |
**核心技能:** 对 AI 管道的良好反馈绝不仅仅是“AI 错了”。它应当是具体的且可构建的 — 指出它跳过了什么检查,以及怎样一个简单的改变就能扭转判决。这就是这些系统所依赖的人在回路(Human-in-the-Loop)原则。
## 仓库结构
```
operation-forager-detection-lab/
│
├── run_all.py # Full pipeline runner — one command to run everything
│
├── data/
│ ├── generate_web_logs.py # Stage 1 & 2: credential stuffing + fraud noise
│ ├── generate_identity_logs.py # Stage 3 & 4: vishing + MFA takeover
│ └── generate_cloud_logs.py # Stage 5–8: recon, persistence, evasion, exfil
│
├── detections/
│ ├── IDNT_002_identity_takeover.py # Correlation — MFA reset → device registration
│ ├── CLD_004_access_key_persistence.py # Single-event — access key on dormant account
│ ├── CLD_005_logging_tamper.py # Single-event — CloudTrail disabled
│ └── CLD_006_recon_burst.py # Threshold — count-distinct enumeration commands
│
├── validation/
│ └── harness.py # Scores all 4 rules against ground-truth labels
│
├── ai_exercise/
│ └── triage_simulator.py # AI pipeline with 3 flawed verdicts + analysis
│
├── threat_intel/
│ └── forager-actor-profile.md # FORAGER actor profile + MITRE ATT&CK mapping
│
├── playbooks/
│ ├── PLAY-001-identity-takeover.md # IR playbook for IDNT-002
│ └── PLAY-003-logging-tamper.md # IR playbook for CLD-005
│
├── screenshots/ # 10 screenshots from the live session
│
└── docs/
└── Operation_FORAGER_Project_Writeup.docx
```
## 如何运行
**前置条件:** Python 3.8+ · 无需外部库
```
# Clone 该 repo
git clone https://github.com/seyifalode-cmd/operation-forager-detection-lab.git
cd operation-forager-detection-lab
# Option 1 — 端到端运行完整 pipeline
python run_all.py
# Option 2 — 单独运行各个阶段
python data/generate_web_logs.py # Generate web logs
python data/generate_identity_logs.py # Generate identity logs
python data/generate_cloud_logs.py # Generate cloud logs
python detections/IDNT_002_identity_takeover.py # Run correlation rule
python detections/CLD_004_access_key_persistence.py
python detections/CLD_005_logging_tamper.py
python detections/CLD_006_recon_burst.py
python validation/harness.py # Score all detections — see 4/4 result
# Option 3 — 仅进行 AI exercise
python run_all.py --ai-only
python ai_exercise/triage_simulator.py
```
**预期输出:**
```
OPERATION FORAGER — DETECTION VALIDATION SCORECARD
====================================================
Total log events analysed : 51,225
Detections scored : 4
Detections passed : 4/4
[PASS] IDNT-002 True positives: 1/1 False positives: 0
[PASS] CLD-004 True positives: 1/1 False positives: 0
[PASS] CLD-005 True positives: 1/1 False positives: 0
[PASS] CLD-006 True positives: 1/1 False positives: 0
RESULT: 4/4 attack stages detected — 0 false positives
```
## 展现的技能
**威胁建模**
- 设计了一个真实的、基于专注于身份的威胁组织(Scattered Spider / Lapsus$)建模的现代入侵模型
- 将每个攻击阶段映射到 MITRE ATT&CK 技术,并进行了准确的战术分配
- 刻意排除恶意软件以强制进行行为检测 — 没有特征码,没有哈希
**检测工程**
- 以三种结构类型编写规则:关联、单事件和独立计数阈值
- 以查询语言(支持 SIEM)和可运行的 Python 两种形式记录了每一条规则
- 包含了明确的调优说明 — 如何在不使规则致盲的前提下减少误报
- 交付了可供其他工程师审查的规则,而不仅仅是原作者自己
**度量原则**
- 构建了一个验证工具,根据真实标签对检测进行评分
- 报告了真阳性率和假阳性率 — 不是主观断言,而是可测量的结果
- 设计了具有符合真实安全运营的攻击与噪声比例的数据集
**云安全**
- 认识到在云环境中,身份就是边界
- 明白禁用日志是攻击者产生的最强烈的信号之一
- 围绕账户上下文(休眠还是活动)而不仅仅是操作行为来设计持久化检测
**人在回路(Human-in-the-Loop)验证**
- 识别出 AI 分诊的三种典型失败模式:上游盲点、标签匹配、将缺失视为证据
- 提供了结构化、具体、可操作的反馈 — 不是简单的“AI 错了”,而是确切指出它跳过了什么
- 展示了现代 SOC 运营所依赖的人在回路(Human-in-the-Loop)原则
*Oluwaseyi Michael Falode · 网络安全与云安全工程师 · 多伦多,安大略省 · 2026年5月*
*linkedin.com/in/oluwaseyi-falode · github.com/seyifalode-cmd*
标签:Python, SOAR, 安全, 安全运营中心, 无后门, 网络映射, 超时处理