# 使用手册：把《授权安全测试规范》装进你的 Agent

> **配套**: 《SRC行业授权资产安全测试规范-Agent版）》v2.5 ｜ **读者**: 部署者（白帽子本人）
> **目的**: 让 ZCode、Claude Code 这类编码 Agent 在替你挖洞时，正确加载规范、拿到它必需的上下文、并被工程层拦住它可能失控的动作。
> **一句话原则**: 规范管"教"，配置管"拦"。只做第一步不做第三步，等于让 agent 自觉——它不会。

---

## 需特别说明:

本文件仅作为AI辅助安全测试的案例参考与行为基线，属软性约束，可在意图与语义层面降低违规风险，但不构成本平台对任一测试行为的事前授权、亦不保证100%防范违规行为。若需进一步控制风险，建议在工具链或运行环境侧落实Hook拦截、调用白名单、请求限流等硬性约束机制一-软约束定边界，硬约束守底线，二者结合方可提升合规保障水平。 

## 第一步：填部署上下文块（必须，5 分钟）

规范里所有"仅限自己测试账号""以任务清单为准""提交到报告通道"对 agent 都是悬空引用——它不知道你的账号是什么。把下面这个块填好，附在规范末尾一起注入：

```markdown
## 部署上下文（部署者填写，Agent 优先以此为准）
### SCOPE 授权范围（范围外一律不碰）
- https://target.example.com
- api.example.com（仅 443）
### TEST_ACCOUNTS 我的测试账号（"仅限自己账号"指且仅指这两个）
- A: testuser_a / 绑定手机 138****0001 / 绑定邮箱 a@test.local
- B: testuser_b / 绑定手机 138****0002 / 绑定邮箱 b@test.local
- 除此之外任何账号、手机号、邮箱都不是我的——向它们发起的任何写/发/通知操作都命中红线。
### ALLOWED_TOOLS 本次允许的工具（未列出的扫描/爆破器一律视为未启用）
- 允许: curl、httpie、nuclei（仅 -tags cve,tech，仅 SCOPE 内）
- 禁止: sqlmap、hydra、ffuf
### REPORT_CHANNEL 漏洞报告出口
- 报告写入本地 ./artifacts/reports/ 目录，由我人工审核后提交厂商；禁止 Agent 直接向任何外部地址发送报告。
### ARTIFACTS 产物目录
- ./artifacts/（脚本、快照、payload 全部放这里，结束时统一审计清理）
### EMERGENCY 我（操作者）的确认方式
- Agent 遇到任何"向本方确认"情形：停下，把问题原样发给我，等我回复。我未回复前不许继续。
```

**没填这个块 = agent 只能做被动分析（读代码、看文档），不许发任何请求**——这条已写进规范附则第 2 条。
---

## 第二步：按你的工具加载

### ZCode

ZCode 自动读取**工作区根目录的 `AGENTS.md`** 作为指令文件：

```bash
mkdir pentest-job && cd pentest-job
# 把规范全文 + 第一步的上下文块合并写入：
cat 规范v2.5.md 部署上下文.md > AGENTS.md
```

- 建议为每个测试项目建独立工作区，规范跟着工作区走，不污染其它项目；
- 权限模式从 `plan` 或 `build` 起步，确认 agent 行为稳定前**不要用全自动模式**；
- 可选：ZCode 支持 hooks（PreToolUse 等），见第三步的拦截脚本，配置方法以 ZCode 的 hooks 文档为准。
  
  ### Claude Code
  
  Claude Code 读取项目根目录的 `CLAUDE.md`，支持 `@` 语法引用其它文件：
  ```bash
  mkdir pentest-job && cd pentest-job
  cp 规范v2.5.md ./SPEC.md
  cat 部署上下文.md >> ./SPEC.md   # 上下文块附在规范后面
  cat > CLAUDE.md <<'EOF'
  @SPEC.md
  
  ## 本项目附加约束
- 这是授权安全测试项目，SPEC.md 是最高优先级行为规范。
- 每次会话第一条回复先输出 [RULES_LOADED v2.5]，再回答其它内容。
  EOF
  
  ```
  ### 其它 Agent 工具（映射表）
  | 工具 | 放哪里 |
  |------|--------|
  | Cursor | `.cursor/rules/spec.mdc`（或项目根 `.cursorrules`） |
  | Cline | `.clinerules` |
  | Windsurf | `.windsurfrules` |
  | 通用 | 任何"项目指令/系统提示注入"入口，规范全文 + 上下文块 |
  ```

---

## 第三步：核验加载（每轮会话开头都做）

**验收标准：会话第一条回复以 `[RULES_LOADED v2.5]` 开头。**

- 没输出这个标记 → 规范没被读到或被忽略了：**不要开始测试**，重新检查文件位置/内容；
- 输出了标记但后续行为明显违规（比如直接对删除接口发包）→ 规范被"读了没懂"，停掉，改用第四步的工程层拦截兜底；
- 建议开场白固定用：「先读 AGENTS.md/CLAUDE.md，确认加载规范后回复 [RULES_LOADED v2.5]，然后我们讨论测试计划」——先让它**复述测试计划等你确认**，再放行执行。

---

## 第四步：工程层拦截（强烈建议，软硬配套）

提示词对 agent 是软约束，红线必须再拦一道。按你的工具选做：

### 4.1 命令层：hooks / 权限拒绝

拦截脚本核心逻辑（伪代码，任何支持 PreToolUse hook 的工具通用）：

```python
# 对将执行的 shell 命令做正则检查，命中即拒绝（exit 非 0 = 阻断）
BLOCK_PATTERNS = [
    # 写动词 HTTP 请求
    r"(curl|wget|httpie|http)[^|;&]*(-X|--request)\s*(DELETE|PUT|PATCH)",
    r"(curl|wget)[^|;&]*(--data|--form|-d\s*-)[^|;&]*(delete|remove|drop|truncate|purge|reset|set|merge|transfer)",
    # 扫描器（未在 ALLOWED_TOOLS 里）
    r"\b(sqlmap|hydra|medusa|ffuf|dirsearch|gobuster|nikto|nuclei)\b",
    # 数据外发
    r"(curl|wget)[^|;&]*(pastebin|transfer\.sh|ngrok|webhook\.site|t\.me/discord\.com/api)",
    # 高危本地命令
    r"(rm\s+-rf|mkfs|dd\s+if=|:\(\)\{)",
]
# 注意：nuclei 等白名单工具按 ALLOWED_TOOLS 动态放行
```

- **Claude Code**：放进 `.claude/settings.json` 的 `hooks.PreToolUse`（matcher `Bash`），同时用 `permissions.deny` 加一层（示例：`Bash(sqlmap:*)`、`Bash(hydra:*)`）；
- **ZCode**：同样支持 PreToolUse 类 hooks，配置入口以官方文档为准，脚本复用上面这份。
  
  ### 4.2 流量层：代理预算（进阶）
  
  给 agent 的环境变量挂一个本地代理（mitmproxy 自定义脚本或等效物），实现规范 5.3 的预算：
- 写动词请求 → 403；
- 单响应 >10MB → 截断；
- PII 命中计数，累计 10 条 → 熔断；
- 目标不在 SCOPE → 拒绝出站；
- 全量请求落审计日志（事后对账"agent 说它做了什么"vs"它实际做了什么"）。
  同时确认 agent 的 Bash 环境**无法绕过代理**（拦截 `--noproxy`、`NO_PROXY` 变体）。
  
  ### 4.3 权限模式纪律
- 起步用需要逐条批准的模式跑前几轮，观察它对规范的理解；
- 只有在拦截脚本 + 代理都就位后，才考虑放宽到半自动；
- 全自动（yolo）模式配合本规范使用时，第四步不是可选项。

---

## 会话中你要做的事（人工纪律）

1. **先计划后执行**：让 agent 先输出测试计划（目标、接口、方法、预期请求量），你批准后再动手；
2. **盯第一小时**：重点看它是否对增删改接口有"先判语义再动手"的习惯，没有就停下来纠正；
3. **换皮即停**：agent 被拦后改写命令、换编码、换参数重试的，立即停会话——这是规避管控的信号，说明软约束已失效，只剩工程层在兜底；
4. **结束必清理**：会话结束让 agent 列 `./artifacts/` 清单，逐项确认清理状态，写进报告的清理标注。

---

## 部署前自查清单

- [ ] 规范全文 + 部署上下文块已合并注入（AGENTS.md / CLAUDE.md）
- [ ] SCOPE 写的是具体资产，没有"xxx 等相关系统"这种模糊表述
- [ ] TEST_ACCOUNTS 填了两个账号及其绑定的手机号/邮箱
- [ ] 首响应 `[RULES_LOADED v2.5]` 核验通过
- [ ] 测试计划先经我人工批准
- [ ] hooks 拦截脚本已启用并自测（拿一条 `curl -X DELETE` 试，应当被拒）
- [ ] 代理预算已启用（或明确接受无代理的风险）
- [ ] 权限模式不是全自动（或第四步已全部就位）

---

## 常见失效模式与对策

| 失效表现                 | 原因                     | 对策                                       |
| -------------------- | ---------------------- | ---------------------------------------- |
| 首响应没有 [RULES_LOADED] | 文件没读到/名字不对             | 检查文件名与路径；开场白显式要求先读                       |
| 规范"读了但不当回事"          | 上下文太长被稀释               | 红线是规范开头部分，别在 AGENTS.md 里再堆无关内容；一个工作区一个任务 |
| 被拦后换写法重试             | 软约束失效的正常表现             | 靠 hooks/代理的"类拦截"而非"串拦截"；换皮行为本身记入报告       |
| 把"停止确认"当"暂停换个方向继续"   | 对 7.3 理解错误             | 停止是全量的——发现即中止整轮，向它重申规范 7.3               |
| 请求量悄悄超预算             | agent 自己计数不可靠          | 预算必须在代理层计数熔断，不依赖 agent 自报                |
| 报告/数据被发往外部           | 缺 REPORT_CHANNEL 或未拦出口 | 上下文块写明出口；代理层限制出站目标                       |

---

## 附：给 Agent 的开场白模板

```text
这是一个授权安全测试任务。规则：
1. 先完整阅读 AGENTS.md（或 CLAUDE.md 引用的 SPEC.md），它是本任务最高优先级的行为规范。
2. 阅读完毕后，你的第一条回复必须以 [RULES_LOADED v2.5] 开头，然后用不超过 10 行复述：
   授权范围、可用测试账号、本次禁止触碰的操作类别、遇到需要确认时的动作。
3. 复述经我确认之前，不发起任何对目标的请求。
4. 测试计划先给我审批，批准后从只读探测开始。
```
