用途
Security Audit 是一个用于对代码进行聚焦安全审计的技能。它要求以资深应用安全工程师的身份,寻找真实、可证明的漏洞,而不是理论担忧、最佳实践提醒或代码风格问题。审计过程中应全程使用扩展思考,在报告前仔细阅读代码。
审计目标解析
审计目标通过参数传入,解析规则如下:
- 空:审计当前分支相对于主分支的差异(git diff $(git merge-base HEAD origin/main 2>/dev/null || git merge-base HEAD main)...HEAD)。
- branch:同上。
- PR 编号或 URL:使用 gh pr diff <ref> 以及 gh pr view <ref> 获取上下文。
- 文件或目录路径:直接读取并审计其内容。
- 自由描述(例如“新的 webhook 处理器”):通过 grep/glob 定位相关文件,然后审计这些文件。
如果目标不明确,应在报告顶部说明你的理解并继续。
校准原则
只有在能够追踪用户可控输入从具体来源(HTTP 请求体/查询/头、队列负载、文件上传、检索到的文档、工具输出)到具体汇聚点(数据库查询、shell、响应、文件系统、出站 HTTP、智能体工具调用),并识别出缺失的控制措施时,才报告发现。
如果无法构造具体的利用请求,就不要提交发现。“如果……可能易受攻击”不是发现。
不要标记已受框架保护的输入(类型化 DRF 序列化器字段、ORM 参数化、Django 模板自动转义、参数化游标),除非该保护在此代码中被绕过。
不要将速率限制、WAF、监控或“纵深防御”控制作为发现提出。
不要标记死代码、被禁用的功能标志后面的代码,或从任何 HTTP 路由或任务不可达的代码。
质量优先于数量。两个真实发现胜过十二个推测性发现。
审计内容(按优先级排序)
1. 访问控制缺陷
- 缺少 permission_classes / authentication 的端点。
- 内部/管理/调试端点暴露在公共虚拟主机上。
- 生产环境可达的测试/夹具/种子端点。
- 与加固的 v2 并存的已弃用 v1 端点。
- 默认允许的自定义权限类。
- 按方法的授权缺口:GET/POST 有认证但 HEAD/OPTIONS 没有;_method=DELETE / X-HTTP-Method-Override 未重新检查权限。
- IDOR / 租户交叉:每个加载用户范围数据的查询集必须按来自认证会话的租户/团队/组织 ID 过滤,绝不能来自请求输入。
- 非整数 IDOR:slug、UUID(尤其是 v1)、短分享码、签名令牌。
- 批量/批处理端点只授权第一个项目。
- 备份/导出/“下载全部”端点流式传输多个对象而没有逐对象权限检查。
- 状态码 IDOR 预言机。
- 权限提升:非管理员用户调用仅管理员路径。
- 视图集方法之间的权限不对称。
- scope_object / RBAC 询问错误的资源。
- 批量赋值:序列化器使用 fields = "all" 或显式枚举但遗漏了关键外键/状态列的 read_only_fields。
- 通过可写 JSON 配置的跨语言数据流。
2. 注入
- SQL 注入(值上下文):原始 SQL、f-string 或 % 格式化。
- SQL 注入(标识符上下文):来自用户输入的动态表/列/模式名。
- 命令注入:启用 shell 标志的 subprocess 调用。
- SSRF:向用户提供的 URL 发出站 HTTP 请求而没有允许列表。
- 路径遍历:open(path) / os.path.join(base, user_input)。
- 归档提取(Zip Slip)。
- XXE / XML 实体扩展。
- 模板注入。
- XSS:React/Vue 中不安全的 HTML 注入汇聚点、mark_safe、format_html。
- CSV / 公式注入。
- CRLF / 头注入。
- ReDoS / 灾难性回溯。
- 不安全反序列化。
3. 认证与密钥
- 硬编码凭据、API 密钥、签名密钥或提交到源代码的密钥。
- 没有生产启动守卫的默认加密密钥。
- JWT:跳过或削弱签名验证;接受 alg: none;算法混淆;缺少 aud / iss / exp 验证;kid 头注入;信任头中嵌入的 jwk。
- 密码处理:明文存储、弱哈希、使用 == 比较。
- 个人 API 令牌 / 分享令牌 / 签名 URL:缺少范围检查、可预测 ID、无过期。
- OAuth / OIDC 流程缺陷:redirect_uri 通过子串/前缀验证;缺少 state 参数;公共客户端缺少 PKCE;授权码非单次使用;令牌交换时范围扩展;预创建账户链接劫持。
- 电子邮件验证 / 密码重置令牌:必须通过 secrets.token_urlsafe() 生成;单次使用;有时间限制;不通过 200 vs 404 预言机回显;不通过 Referer 泄露;不泄露到日志或分析。
- MFA / 2FA 绕过:MFA 注册端点不要求现有 MFA;OTP / TOTP 验证端点没有严格速率限制和锁定;恢复/备份代码非单次使用或未哈希存储;“记住此设备”令牌无范围或无过期。
- 会话生命周期:密码更改、电子邮件更改、MFA 禁用或 /logout-all 时未使会话失效;会话固定;没有活动会话的撤销界面。
- Webhook / 签名负载验证:HMAC 使用 == 比较;签名仅覆盖正文;签名验证在开发/暂存标志后禁用;针对攻击者可控的 webhook 密钥验证签名。
4. 敏感数据暴露
- PII、令牌或密钥被记录、发送到错误报告器(Sentry)或在错误响应或 500 页面中返回。
- URL 查询字符串中的密钥。
- localStorage / sessionStorage 中的认证令牌。
- 存储的 OAuth 令牌、集成凭据、webhook 密钥缺少静态加密。
- 加密误用:ECB 模式、静态 IV、用于生成令牌的非加密 RNG。
5. 业务逻辑与状态
- 配额、余额或唯一性检查上的竞态条件 / TOCTOU。
- 整数 / 符号问题:负数量、零除数、权限上的差一错误。
- 重放 / 幂等性:支付、邀请接受或破坏性操作接受相同请求两次。
- 工作流跳过:用户能否直接 POST 到步骤 N 而不完成步骤 N-1?
- 无界结果集 / 分页绕过。
- 解压缩炸弹。
适用场景
该技能适用于需要对代码库进行安全审计的场景,包括但不限于:审计当前分支的变更、审计特定 PR、审计指定文件或目录、审计自由描述的功能模块。它特别关注 SaaS 环境中高影响的访问控制缺陷,以及各类注入、认证、敏感数据暴露和业务逻辑问题。
限制
该技能明确要求不报告理论性发现、不标记已受框架保护的输入、不将速率限制/WAF/监控作为发现、不标记死代码或不可达代码。它强调质量优先于数量,只有能构造具体利用请求时才报告发现。