$npx -y skills add zhiyuwang720-dev/CodeAuditSkill --skill web-vuln-auditWeb 项目安全代码审计 skill,自动识别 Go / Java / Python / PHP / JavaScript 项目类型并加载对应漏洞清单(SQL/SSRF/XSS/CSRF/反序列化/路径穿越/鉴权/命令注入/XXE 等),输出审计报告到被审计项目的 reports/ 目录。适用于:(1) 单仓库 Web 项目的中高危漏洞扫描,(2) 自动生成可复现的漏洞报告(含代码位置、复现 curl、修复建议、修复后验证),(3) 对每条漏洞并行启动子 Agent 进行可利用性验证,输出 PoC 步骤或误判说明。只审计 High/Medium,跳过 L
| 1 | # Web 项目漏洞代码审计 Skill |
| 2 | |
| 3 | 对 Go / Java / Python / PHP / JavaScript Web 项目进行系统化源码安全审计,输出可交付的审计报告 + 每条漏洞的并行验证报告(真实漏洞 PoC 或误判说明)。 |
| 4 | |
| 5 | --- |
| 6 | |
| 7 | ## 核心约束(强制遵守) |
| 8 | |
| 9 | 1. **报告输出路径** = `{TARGET_PROJECT}/reports/`(被审计项目根目录,**不是** skill 仓库内)。主审计报告命名 `{project-name}-audit-{YYYY-MM-DD}.md`。 |
| 10 | 2. **只审计 High / Medium**。Low 漏洞**一律不写入报告**(即使发现也跳过)。 |
| 11 | 3. **审计报告必须含「项目文件树 + 审计标记」章节**:全部目录到文件,仅源码文件(`.go` / `.java` / `.kt` / `.scala` / `.py` / `.php` / `.js` / `.ts`)标记 `(审计)` / `(未审计)`,其他文件类型无标记。 |
| 12 | 4. **Phase 4 子 Agent 必须并行 spawn**:在单次响应中通过多个 `Agent` 工具调用并行启动(不是串行)。 |
| 13 | 5. **PoC 验证优先真实运行**:从被审计项目 README 提取 docker / docker-compose 启动指令,实际拉起环境并发送真实 HTTP 请求复现;失败再降级为静态代码证明,并在报告中显式标注「未运行验证,仅静态推理」。 |
| 14 | 6. **PoC / FP 报告命名**:真实漏洞 → `poc-V-{NNN}.md`;误判 → `fp-V-{NNN}.md`,与主审计报告共存于 `reports/`。 |
| 15 | 7. **Phase 3 主审计和 Phase 3.5 二次扫描必须遵守 Agent Contract**:包括工具约束(Grep/Glob/Read,禁 Bash grep/find/cat)、Turn 预留规则(max_turns - 3 时停止探索并产出输出)。详见下方「工具使用约束」章节。 |
| 16 | |
| 17 | --- |
| 18 | ## 工具使用约束(Agent Contract) |
| 19 | |
| 20 | > 以下约束适用于 **Phase 3 主审计**、**Phase 3.5 二次扫描** 和 **Phase 4 子 Agent**。每条规则都是强制性的。 |
| 21 | |
| 22 | ### 1. 工具约束 |
| 23 | |
| 24 | | 约束 | 详情 | |
| 25 | |------|------| |
| 26 | | **搜索** | 必须使用 Grep(ripgrep 模式,1-3 秒)定位,Glob 匹配文件名,Read 读文件 | |
| 27 | | **禁止写法** | **Bash 中的 grep / find / cat**(性能退化) | |
| 28 | | **超时** | Bash timeout ≤30s。Grep 超时 → 缩小 path → 连续失败 2 次 → 跳过 | |
| 29 | |
| 30 | ### 2. Turn 预留规则 |
| 31 | |
| 32 | ``` |
| 33 | Phase 3 主审计: |
| 34 | max_turns = 30(根据项目规模调整:小项目 20,大项目 40) |
| 35 | turns_used ≥ max_turns - 3 时:立即停止探索,产出结构化输出 |
| 36 | 不得将最后 3 个 turn 用于新的 Grep/Read 探索 |
| 37 | |
| 38 | Phase 3.5 二次扫描: |
| 39 | max_turns = 20(聚焦搜索,比对主审计少) |
| 40 | turns_used ≥ max_turns - 3 时:立即停止搜索,产出结构化输出 |
| 41 | 不得将最后 3 个 turn 用于新的 Grep/Read 探索 |
| 42 | |
| 43 | Phase 4 子 Agent: |
| 44 | max_turns = 15(单漏洞验证,任务聚焦) |
| 45 | turns_used ≥ max_turns - 3 时:立即停止验证,产出判定结果 |
| 46 | ``` |
| 47 | |
| 48 | 违反 Turn 预留将导致输出丢失,整个 Agent 的发现可能被截断。 |
| 49 | --- |
| 50 | |
| 51 | ## 输入 |
| 52 | |
| 53 | 用户提供(或采用默认): |
| 54 | - `target_project`:被审计项目的根目录路径。**默认为当前工作目录**。 |
| 55 | - 可选:`scope`(审计范围,如 `internal/`、`src/main/java/`),不指定则全量。 |
| 56 | |
| 57 | ## 输出 |
| 58 | |
| 59 | 写入到 `{target_project}/reports/`: |
| 60 | - `{project}-audit-{YYYY-MM-DD}.md` —— 主审计报告(漏洞清单 + 文件树 + 详细发现 + 验证汇总) |
| 61 | - `poc-V-{NNN}.md` —— 每个真实漏洞一份独立 PoC 报告 |
| 62 | - `fp-V-{NNN}.md` —— 每个误判一份误判说明 |
| 63 | |
| 64 | --- |
| 65 | |
| 66 | ## 执行流程 |
| 67 | |
| 68 | ### Phase 0 — 输入解析 |
| 69 | |
| 70 | 1. 解析 `target_project`(缺省 = `pwd`) |
| 71 | 2. 创建输出目录:`mkdir -p {target}/reports/` |
| 72 | 3. 记录审计起始时间,确定主报告文件名 `{project}-audit-{YYYY-MM-DD}.md` |
| 73 | |
| 74 | ### Phase 1 — 项目类型识别 |
| 75 | |
| 76 | 读取 `references/project-detection.md` 的探测规则: |
| 77 | |
| 78 | | 信号 | 判定 | 加载清单 | |
| 79 | |---|---|---| |
| 80 | | 根目录存在 `go.mod` | Go | `references/go-vuln-checklist.md` | |
| 81 | | 根目录存在 `pom.xml` / `build.gradle` / `build.gradle.kts` | Java | `references/java-vuln-checklist.md` | |
| 82 | | 根目录存在 `requirements.txt` / `setup.py` / `pyproject.toml` / `Pipfile` | Python | `references/python-vuln-checklist.md` | |
| 83 | | 根目录存在 `composer.json` | PHP | `references/php-vuln-checklist.md` | |
| 84 | | 根目录存在 `package.json`(且无 `go.mod` / `pom.xml`) | JavaScript/Node.js | `references/javascript-vuln-checklist.md` | |
| 85 | | 同时存在多种标记 | mixed | 对应清单都加载,按文件后缀路由 | |
| 86 | | 均不匹配 | abort | 终止并提示用户确认项目类型 | |
| 87 | |
| 88 | 附加:扫常见框架 import(Gin / Echo / Fiber / Spring Boot / JAX-RS / Servlet / Flask / Django / FastAPI / Laravel / Symfony / Express / Next.js),用于 Phase 2 建模时精准定位入口注册点。 |
| 89 | |
| 90 | ### Phase 2 — 快速建模(10~30 分钟) |
| 91 | |
| 92 | 按已加载清单的 §3 执行: |
| 93 | |
| 94 | 1. **找入口**:路由注册点、`main`、Controller、Filter、Handler |
| 95 | 2. **划信任边界**:HTTP 输入(query/body/header/path/cookie)、外部系统(DB/Redis/MQ/第三方 HTTP)、配置(env/文件/Secret) |
| 96 | 3. **列高危 sink**:命令执行 / SQL / 文件 / 网络 / 模板 / 反序列化 / XXE |
| 97 | 4. **生成项目文件树初版**:用 `find` 或 `ls -R` 列出全部目录到文件,源码文件后追加 `(未审计)` 占位(Phase 3 审计时改为 `(审计)`) |
| 98 | |
| 99 | ### Phase 3 — 主审计 |
| 100 | |
| 101 | 按清单的 §4 分主题逐项扫描。**每发现一条 High / Medium 漏洞**: |
| 102 | |
| 103 | 1. 立即追加到主审计报告(用 `references/audit-report-template.md` 的格式) |
| 104 | 2. 同步更新 §2.5 文件树章节:把对应源码文件的标记从 `(未审计)` 改为 `(审计)` |
| 105 | 3. 漏洞编号 V-001、V-002、... 依次递增 |
| 106 | 4. **Low 漏洞跳过**:发现 Low 时记录在心里即可,不写入报告 |
| 107 | |
| 108 | 主审计报告结构: |
| 109 | - §1 概览 + 风险结论(只有 High / Medium 计数) |
| 110 | - §2 发现列表(表格) |
| 111 | - §2.5 **项目文件树与审计覆盖**(全目录到文件,源码标审计状态) |
| 112 | - §3 详细发现(每条 V-XXX 含位置、证据、复现、修复、验证) |
| 113 | - §4 架构级风险与改进建议(可选) |
| 114 | - §5 验证结果(Phase 5 填充) |
| 115 | |
| 116 | ### Phase 3.5 — 同类漏洞二次寻找与系统性缺陷发现 |
| 117 | |
| 118 | > 前置条件:Phase 3 主审计已完成,主审计报告已初步生成(含 §1–§4)。 |
| 119 | > 目的:当 Phase 3 发现某类漏洞的 1–2 个实例时,这可能指向系统性缺陷 —— 相同模式很可能在代码库的其他位置(特别是未审计文件)存在更多实例。 |
| 120 | > Phase 3.5 执行一次"模式驱动"的全量搜索,发现被 Phase 3 遗漏的同源漏洞。 |
| 121 | |
| 122 | #### Step 3.5.1 — 分析 Phase 3 漏洞分布 |
| 123 | |
| 124 | 1. 读取主审计报告 §2 发现列表,构建**漏洞类型分布表**: |
| 125 | |
| 126 | ``` |
| 127 | | 漏洞类型 | 数量(Phase 3)| 涉及文件 | 涉及目录 | |
| 128 | |----------|---------------|---------|---------| |
| 129 | | SQL 注入 | 2 | ... | ... | |
| 130 | ``` |
| 131 | |
| 132 | 2. 对每种漏洞类型,提取 Phase 3 发现的**脆弱模式特征**: |
| 133 | - 使用的 sink 函数/API(如 `db.Query(fmt.Sprintf(...))`、`exec |