---
name: security-review
description: "代码安全审查，识别漏洞与威胁风险"
---


## When to use 

此技能应该在以下情况下使用：

- 用户请求代码审计 、 安全审计或漏洞扫描
- 用户请求检查代码安全或查找安全问题
- 用户提及了 /audit 或 /security-review
- 用户希望在部署之前审查代码中的漏洞
- 用户需要渗透测试准备或安全评估

## What to do

你的任务包括：

1、与用户交互理清扫描任务目标和输出目录
2、管理任务队列并调度审计任务
3、总结任务结果并清理中间输出

理解调度逻辑:

1. 从队列获取下一个待审计文件路径
2. 创建子任务: 敏感操作识别
3. 为每个敏感操作创建子任务: 上下文分析
4. 直到队列为空
5. 处理收尾工作

## 分析步骤

! 严格执行以下状态机，不允许因为代码文件过多、考虑效率等原因而裁剪/跳出流程
! 待审计文件数量多时，更要严格执行步骤切换，这是保证审计过程有序不遗漏的关键
! 上下文分析任务必须通过创建子任务完成，以隔离分析过程
! 不要在主流程中直接读取待审计代码文件，应该通过子任务分析

### Step1 向用户明确扫描目录与输出目录

默认扫描目录：当前工作目录
默认输出目录：`security-review_result/`
子任务并发: 默认为 3

预备项（不要询问用户，自行通过命令/工具检查）:
- 检查bash/git-bash是否可用: `bash --version`
- 检测操作系统类型: linux/macos 或 windows 
- 输出语言：如果用户使用中文则使用中文输出，否则自行决定
- 加载用户提示: 路径 `<当前工作目录>/SECURITY.md`（若不存在则跳过）

! 如果输出目录已存在，询问用户需要重命名以备份该目录或是直接删除（默认操作：备份）
! 输出的任何文件都要在设定的输出目录下
! 不允许变更工作目录，当需要输出临时测试内容时，可以临时创建 `<输出目录>/tmp` 临时目录进行操作
! windows下仅在bash不可用时，才使用powershell执行 `.bat` 脚本，否则统一使用bash脚本
! 如果用户提示文件 `<当前工作目录>/SECURITY.md` 存在，则必须加载

### Step2 扫描队列初始化

为了保证扫描任务的有序进行，必须通过队列脚本 scripts/queue.sh 生成待审计队列

- 当用户指定扫描目录时，使用 init 创建队列
- 当用户指定要扫描的文件时，使用 push 创建队列
- 当用户指定要扫描的分支、commit时，灵活使用 push 创建队列

! 注意执行脚本时，使用 **绝对路径** 执行，不要 **cd改变工作目录**
! 如果在windows环境下，没有bash时，使用`scripts/queue.bat`作为替代
! 执行queue脚本失败时，加载失败处理流程 `scripts/fail_process.md` 收集信息后，**直接结束审计流程**
! `queue.bat`执行失败时，必须跳过后续所有步骤，进入失败处理流程 `scripts/fail_process.md` ，**不允许自由审计**

工具原理：

- 对于目录，grep列出所有非空文件路径记录到 .queue 文件中，每次 pop 从文件中移除一行待审计路径
- 对于diff，通过解析git diff的信息提取 变更文件和行号范围记录到 .queue 文件中，每次 pop 从文件中移除一行待审计路径&范围；注意使用脚本的diff子命令时，你需要提供diff参数，如：
  - diff两个分支： branch1 branch2
  - diff两个commit： hash1 hash2
  - 查看某commit变更： hash1^ hash1
- 对于手动添加，允许指定文件路径列表添加，也允许按 <文件路径>:<开始行>:<行数> 这样以冒号分隔的变更范围列表添加

```bash
# 初始化待审计队列
bash "<本SKILL目录>"/scripts/queue.sh init <scandir>

# 直接指定需要扫描的路径（自动创建队列，指定目录时自动递归目录下所有文件，指定文件时可以指定行号范围）

bash "<本SKILL目录>"/scripts/queue.sh push <path1> [<path2> <path3>:<start_line>:<line_num> ...]

# 通过指定 git diff 参数生成变更块队列

bash "<本SKILL目录>"/scripts/queue.sh diff [git diff 参数...]

# 查看队列剩余待审计路径
bash "<本SKILL目录>"/scripts/queue.sh status

# 弹出一个待审计路径（同时提示报告输出目录）
bash "<本SKILL目录>"/scripts/queue.sh pop

# 清理扫描队列（仅在审计完成时使用）
bash "<本SKILL目录>"/scripts/queue.sh clean
```

windows部分示例:
```powershell
# windows下， 指定行号范围的格式是 <路径>#<开始行>#<行数>，使用 # 作为分隔符
& "<本SKILL目录>\scripts\queue.bat" push "<path1>" ["<path2>" "<path3>#<start_line>#<line_num>" ...]
# 其他基本子命令参数基本一致
& "<本SKILL目录>\scripts\queue.bat" status

& "<本SKILL目录>\scripts\queue.bat" pop
```

### Step3 执行队列脚本，逐个进行审计

执行队列脚本弹出一个文件路径，并且关注脚本的 **报告输出路径** 提示，明确报告输出的目录路径
针对该文件的所有中间结果、报告文件等均输出到该 **报告输出路径** 

! 必须通过队列进行逐个审计，以保证审计不遗漏
! 以下与实际代码无关的路径跳过不审计:
  - IDE等开发相关路径，如 .vscode/, .idea/, .claude, .costrict等
  - 二进制文件，如 xx.png, xx.so 等
  - 项目文档，如 xxx.md, xx.rst 等
  - 其他你知晓的无关文件

### Step4 创建识别敏感操作子任务

创建两个敏感操作识别子任务，对应识别方法如下:

- Sink类敏感操作识别任务: `<本SKILL目录>/threat-explore/sink_func_reg.md`
- 逻辑&配置类敏感操作识别任务: `<本SKILL目录>/threat-explore/logic_opr_reg.md`

传递给子任务的信息包括：

- 指示子Agent加载识别方法 `<本SKILL目录>/threat-explore/xxx.md` 识别敏感操作，并按方法要求输出结果
- 传递待分析文件路径
- 要求其分析前加载规则
- 要求其严格按照识别分析步骤执行
- 不要输出结果到文件
- 要求其输出具有风险的敏感操作
- Sink类/业务逻辑类/配置类敏感操作只要存在风险都要检出，**不允许遗漏**
- 任务相关的用户提示

! 必须创建子任务进行敏感操作识别，不要在当前流程中直接读取代码文件进行识别，这将导致对话上下文隔离失效
! 创建子任务前，**不要越过子任务预先读取识别方法**，这不是你的工作
! 最后一个子任务输出风险敏感操作后，必须立刻执行 `Step5`，不可跳过或者临时执行其他子任务

### Step5 创建上下文分析子任务

为 `Step4` 中识别出的每个敏感操作创建 **上下文分析子任务**，传递给子任务的信息包括：

- 指示其加载任务描述 `<本SKILL目录>/threat-explore/agent.md`
- 敏感操作相关必要描述（包括文件路径、行号范围、相关描述、代码片段等）
- 中间报告输出路径（创建多个子任务时，需要保证路径唯一，因此需要调整文件名最后的编号位）
- 确认为无风险/误报的结果，不要输出报告到文件
- 唯一允许的输出目录为 `<输出目录>/`, 输出文件到其他目录的行为是非法行为，如果需要临时目录，请在输出目录下创建
- 传递注意事项: 1、默认不读取工作区外文件；2、禁止执行无关命令，如安装依赖、删除代码文件等；3、尽可能使用内置工具完成文件读写
- 任务相关的用户提示

! 注意一个敏感操作对应创建一个子任务
! 如果敏感操作过多时，注意不要并发创建过多子任务，注意限制并发
! `Step4` 输出敏感操作后，`Step5` 必须紧随其后执行，不允许跳过
! 子任务成功结束后回到 `Step3`，除非队列已空

### Step6 总结收尾

1、为本次扫描任务输出一份审计总结，总结输出到 `<输出目录>/task_summary.md`
2、使用 `bash "<本SKILL目录>"/scripts/merge_reports.sh <输出目录>` 合并审计总结和所有报告
3、扫描队列清理: `bash "<本SKILL目录>"/scripts/queue.sh clean`
4、检查步骤2生成的`<输出目录>/full_report.jsonl`报告是否正常，如有问题自动修复，不要重复调用脚本

! 如果在windows环境下，没有bash时，使用`scripts/merge_reports.bat`作为替代

## 特别说明

! 如果发现接近token限制，应当尝试进行上下文压缩总结，而不是快速结束审计
! 如果出现脚本执行失败的问题，进入失败处理流程 `scripts/fail_process.md` ，禁止自由审计
