--- name: code-security-audit description: > 对代码项目进行全面安全审计,支持 Python、Node.js、Go、Java 四种语言。 包含依赖漏洞扫描(结合原生工具 + Claude 分析)、代码安全模式检查(OWASP Top 10、注入、反序列化、 敏感信息泄露、认证授权、加密问题等)、业务逻辑审计、攻击链构建、配置审计、以及结构化报告输出。 触发场景:(1) 用户要求对项目进行安全审计/安全检查/代码审计 (2) 用户要求检查代码中的安全漏洞 (3) 用户要求进行依赖漏洞扫描 (4) 用户提到 security audit、vulnerability scan、代码审计、安全扫描、渗透测试前的代码审查 (5) 用户要求检查 OWASP Top 10 相关问题 --- # 代码安全审计 对项目执行安全审计,支持三种审计模式以平衡深度与 token 消耗。 ## 审计模式选择 触发时先确定审计模式。用户明确指定则使用指定模式,否则默认 **中度**。 | 触发关键词 | 模式 | |-----------|------| | "快速扫描"、"quick scan"、"轻度审计"、"light" | 轻度 | | "安全审计"、"代码审计"、"audit"(默认) | 中度 | | "深度审计"、"full audit"、"deep"、"渗透测试级" | 深度 | ### 轻度审计(Quick Scan) 目标:快速发现高危问题,最小 token 消耗。 | 阶段 | 执行内容 | |------|---------| | Phase 1 | 仅识别语言/框架,不画模块地图和攻击面清单 | | Phase 2 | 单 Agent,仅搜索 Critical/High 级别模式(每语言 Top 10 高危模式) | | Phase 3 | 跳过 | | Phase 4 | 跳过攻击链,仅基本验证(排除明显误报) | | Phase 5 | 终端简要输出,不生成报告文件 | 不执行多轮审计。不加载 references 文件(使用内置知识)。依赖审计仅运行工具扫描,不做 Claude 分析。 **轻度模式 Top 10 高危模式**(跨语言通用): 1. `eval(`/`exec(`/`Runtime.exec`/`os.system` — 代码/命令执行 2. `pickle.loads`/`ObjectInputStream`/`yaml.load` — 不安全反序列化 3. SQL 字符串拼接(`"SELECT.*" + `/`Statement`/`${}` in Mybatis) 4. 硬编码密码/密钥(`password\s*=\s*["']`/`secret`/`api_key`) 5. `shell=True`/`child_process.exec` — 命令注入 6. `dangerouslySetInnerHTML`/`innerHTML`/`v-html` — XSS 7. `verify=False`/`InsecureSkipVerify` — TLS 绕过 8. `DEBUG\s*=\s*True`/`NODE_ENV.*development` — 生产环境调试模式 9. `cors.*origin.*\*` — CORS 全开 10. `log4j`/`fastjson` 已知高危版本 ### 中度审计(Standard Audit) 目标:覆盖主要安全风险,合理 token 消耗。 | 阶段 | 执行内容 | |------|---------| | Phase 1 | 完整信息收集 + 依赖审计(工具 + Claude 分析) | | Phase 2 | 2-3 个 Agent 并行扫描,覆盖所有 Critical/High/Medium 模式 | | Phase 3 | 仅审计 P0 文件(认证链 + 未认证端点 + 核心 Sink 聚合点) | | Phase 4 | 基本验证(四步法),不构建攻击链 | | Phase 5 | 完整报告(无攻击链章节) | 单轮审计。按需加载 vulnerability_rules.md 中对应语言章节。 ### 深度审计(Full Audit) 目标:最大化发现率,适合安全评审和渗透测试前审查。 执行完整五阶段流程 + 多轮审计策略 + 攻击链构建。即下文描述的全部内容。 --- ## 审计哲学 ### 核心分析模型 所有安全漏洞的本质:**不可信的数据到达了危险的操作**。 ``` Source(源) 用户可控的输入入口 ↓ Propagation(传播) 数据流经的函数、过滤、转换 ↓ Sink(汇) SQL执行、命令执行、文件读写等危险操作 ``` 审计的三个核心动作: 1. 找到所有 Source(识别攻击面) 2. 追踪 Propagation(验证中间是否有有效过滤) 3. 确认是否有未过滤的路径到达 Sink(漏洞判定) ### 优先级排序 ``` 优先级 = (攻击面大小 × 潜在影响) / 利用复杂度 ``` | 维度 | 高权重 | 低权重 | |------|-------|-------| | 攻击面 | 未认证可达 | 内部接口 | | 潜在影响 | RCE、全库读取 | 信息收集 | | 利用复杂度 | 单请求触发 | 需物理接触 | **第一条决策原则:永远优先审计认证链。** 认证绕过能把所有需认证才能触发的漏洞升级为未认证漏洞。 ## 五阶段审计流程 ### Phase 1: 信息收集与攻击面识别(10% 精力) 此阶段**不搜漏洞**,只产出四样东西: **1. 技术栈画像** - 检测语言标识文件:Python (`requirements.txt`等), Node.js (`package.json`等), Go (`go.mod`), Java (`pom.xml`等) - 识别框架(Django/Flask/FastAPI, Express/Koa/Next.js, Gin/Echo, Spring/Mybatis) - 识别数据库、中间件、模板引擎 **2. 模块地图** - 扫描目录结构,识别路由层、控制器层、服务层、数据访问层 - 标注各模块的职责和依赖关系 **3. 攻击面清单** - 列出所有 API 端点(HTTP 方法、路径、认证状态) - 标记未认证端点、GET 写操作、管理端点(admin/metrics/swagger/actuator) - 识别所有外部入口(API、WebSocket、消息队列、定时任务)和出口(HTTP 出站、邮件、文件写入) **4. 安全机制** - 识别认证方案(JWT/Session/OAuth)、授权中间件、CSRF 保护 - 识别输入校验方式、输出编码、加密方案 **依赖审计**也在此阶段执行: - 运行 `scripts/dep_audit.sh` 或 `scripts/dep_audit_java.sh`(工具不可用则跳过) - 读取依赖清单,分析已知高危版本、废弃包、typosquatting、宽泛版本范围 > 后续所有 Agent 的方向、搜索模式、优先级排序,全部基于这张地图推导。没有地图就没有方向。 ### Phase 2: 并行模式匹配扫描(30% 精力) **Agent 决策链**: ``` Phase 1 攻击面清单 → 推导审计方向 → 按"可并行 + 不重叠"切分 Agent → 执行 ``` **核心原则:Agent 的方向由攻击面决定,不是固定模板。** 项目没有文件上传就不设文件操作 Agent。 **切分约束**: - 约束 1:搜索模式互不重叠,每个 Agent 有独占的 Grep 模式集 - 约束 2:可完全并行执行,Agent 之间零依赖 **典型 Agent 映射**(根据 Phase 1 发现动态调整): | 探测发现 | 审计方向 | Agent 任务 | |---------|---------|-----------| | Web 框架 + REST API | 认证/授权链 | Agent: 认证与授权 | | 数据库连接 | SQL/NoSQL 注入 | Agent: 注入 | | 文件上传 + HTTP 出站 | SSRF + 文件操作 | Agent: 文件/SSRF | | 模板引擎/eval/exec | XSS/SSTI/RCE | Agent: 代码执行 | | 业务交易逻辑 | IDOR/数值/竞态 | Agent: 业务逻辑 | **Agent 数量**:小型项目 2-3 个,中型 3-5 个,大型 5-9 个。 按语言加载对应规则,参考 [references/vulnerability_rules.md](references/vulnerability_rules.md)。 核心检查项: - **注入**: SQL注入、命令注入、LDAP注入、模板注入(SSTI)、XSS - **NoSQL注入**: MongoDB `$where` 拼接、操作符注入(`$gt`/`$ne`/`$regex`) - **反序列化**: pickle/yaml/ObjectInputStream/Fastjson 不安全反序列化 - **认证授权**: 硬编码凭证、JWT 配置、Session 管理、越权风险 - **加密**: 弱算法(MD5/SHA1/DES)、硬编码密钥、不安全随机数 - **敏感信息**: API Key/密码/Token 硬编码、日志泄露、错误信息泄露 - **文件操作**: 路径遍历、不受限的文件上传 - **SSRF/XXE**: 不受限的 URL 请求、XML 外部实体 - **前端安全**: `innerHTML`/`dangerouslySetInnerHTML`/`bypassSecurityTrust*`、前端路由泄露、前端硬编码凭据 - **业务逻辑**: IDOR、Mass Assignment、数值校验缺失、竞态条件、CSRF、反自动化 - **原型污染** (Node.js) / **Log4Shell** (Java) - **供应链**: typosquatting、废弃包、可疑依赖来源 > Phase 2 的核心产出是"高风险区域地图",不是最终漏洞清单。发现率 30-50% 是正常的。 ### Phase 3: 关键路径深度审计(40% 精力) 对 Phase 2 标记的高风险文件做逐行审计。文件优先级排序: | 优先级 | 文件类型 | 决策依据 | |-------|---------|---------| | P0 | 认证过滤器 / Token 处理 | 认证绕过影响全系统 | | P0 | 未认证可达的接口 | 直接暴露的攻击面 | | P0 | Sink 最密集的核心业务入口 | 漏洞密度最高 | | P1 | 文件上传下载 / HTTP 出站工具类 | 路径遍历、SSRF | | P2 | 配置类、加密工具类 | 配置缺陷、密钥管理 | **逐行审计逻辑**: ``` 对每个 P0/P1 文件: 1. 读取完整结构(字段、方法列表) 2. 从 public 方法开始,追踪每个参数的数据流 3. 对每个分支判断: ├── 参数是否经过验证/过滤?→ 检查验证逻辑完整性 ├── 参数是否到达 Sink? → 记录完整路径 └── 是否有绕过过滤的路径? → 分析边界条件 4. 记录: 文件 → 行号 → 漏洞类型 → 完整数据流路径 ``` **关键决策:优先审计 Sink 聚合点。** 如果项目有统一的 HTTP 出站工具类,审计这一个文件就覆盖所有 SSRF 风险。 **配置审计**也在此阶段执行: - DEBUG/开发模式、CORS 配置、安全 HTTP 头、数据库明文密码 - TLS/SSL 配置、Docker/K8s 安全(特权容器、root 运行) - `.env` 文件是否被 `.gitignore` 排除 - Swagger/Actuator 等管理端点暴露 ### Phase 4: 漏洞验证与攻击链构建(15% 精力) **验证四步法** — 每个疑似漏洞必须过四关: | 步骤 | 验证项 | 判定标准 | |-----|-------|---------| | 1 | 数据流完整性 | Source 到 Sink 中间无截断过滤 | | 2 | 防护可绕过性 | 安全检查是否有遗漏的边界条件 | | 3 | 前置条件可满足性 | 攻击者能否到达漏洞触发点 | | 4 | 影响范围 | 利用后最大损害(RCE?数据泄露?提权?) | 四步全过 → 确认漏洞。任一步不过 → 降级或排除。 **攻击链构建**: ``` 对每个 Critical/High 漏洞: 1. 确认前置条件(需要认证?什么权限?什么网络位置?) 2. 如果需要认证 → 检查是否有认证绕过可串联 3. 确认利用结果(信息泄露?代码执行?权限提升?) 4. 检查结果能否作为下一个漏洞的输入 5. 组合为完整攻击链,评估整体影响 ``` 典型攻击链模式参考 [references/vulnerability_rules.md](references/vulnerability_rules.md) 中的攻击链模式章节。 **等级影响规则**:漏洞 A(认证绕过)消除漏洞 B 的认证前置条件 → B 按"未认证可达"重新评估。编号等级 = 独立等级,攻击链部分 = 组合等级。 ### Phase 5: 报告输出(5% 精力) 参考 [references/report_template.md](references/report_template.md) 输出。 报告包含: 1. 审计摘要(各严重程度的发现数量) 2. 攻击面地图(端点清单、认证状态) 3. 漏洞详情(位置、代码片段、**完整数据流路径**、修复建议、CWE 编号) 4. 攻击链分析(漏洞组合路径、整体影响) 5. 依赖审计结果 6. 配置审计结果 7. 修复优先级建议 ## 多轮审计策略 单轮审计漏报率可达 50-60%。多轮审计每轮执行不同类型的分析: | 轮次 | 目标函数 | 方法 | 发现类型 | |-----|---------|------|---------| | 第一轮 | max(覆盖面) | 模式匹配(Grep + 并行 Agent) | 表面可见:硬编码、未验证、配置缺陷 | | 第二轮 | max(深度) | 数据流追踪(逐行 Read) | 隐藏在数据流中:拼接链、协议注入、权限缺失 | | 第三轮 | max(关联度) | 跨模块交叉验证 | 组合才危险:IDOR+白名单、加密体系缺陷 | ### 轮次终止规则 每轮结束后,强制回答三个问题: 1. **有没有计划搜索但没搜到的区域?** YES → 需要下一轮(补盲区) 2. **发现的入口点是否都追踪到了 Sink?** NO → 需要下一轮(追数据流) 3. **高风险发现之间是否可能存在跨模块关联?** YES → 需要下一轮(交叉验证) 三个问题的答案全部为 NO → 终止。任一为 YES → 继续。 ### 轮次规模参考 | 项目规模 | 典型轮次 | Agent 总数 | |---------|---------|-----------| | 小型(<10K LOC) | 1 轮 | 2-3 个 | | 中型(10K-50K) | 1-2 轮 | 3-5 个 | | 大型(50K-200K) | 2-3 轮 | 5-9 个 | | 超大型(>200K) | 2-4 轮 | 8-15 个 | ## 严重等级判定 三维决策模型:`严重等级 = f(可达性, 影响范围, 利用复杂度)` ``` 漏洞发现 │ 未认证可达? ╱ ╲ YES NO ╱ ╲ RCE/全库读取? RCE/全库读取? ╱ ╲ ╱ ╲ YES NO YES NO │ │ │ │ Critical │ High Medium/Low 广范围数据 泄露/篡改? ╱ ╲ YES NO │ │ High Medium ``` 编号体系:`C-001` (Critical 9.0-10.0), `H-001` (High 7.0-8.9), `M-001` (Medium 4.0-6.9), `L-001` (Low 0.1-3.9) 排序策略:影响最广排最前 → 攻击链根漏洞优先 → 同模块漏洞相邻。 攻击链对等级的影响: - 编号等级 = 独立等级(假设攻击者无其他漏洞) - 攻击链部分 = 组合等级 - 修复链中一环不影响剩余漏洞的独立评级 ## 误报处理 确认漏洞前必须验证: - 危险函数的输入是否来自用户可控数据 - 是否存在上游的输入校验/转义/参数化 - 是否在测试代码中(测试代码中的 `eval` 通常不是漏洞) - 框架是否已内置防护(如 Django ORM 默认参数化) 标记为 "可能的误报" 而非直接忽略,让用户自行判断。 ## 快速参考 依赖审计脚本: - 通用: `scripts/dep_audit.sh <项目目录> [python|node|go|auto]` - Java: `scripts/dep_audit_java.sh <项目目录>` 漏洞规则详情: `references/vulnerability_rules.md` 报告模板: `references/report_template.md`