SuperAPI AI 工具集

security-audit

安全与审计

查看项目

更新于 10-15 14:00

技能介绍

用途

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/监控作为发现、不标记死代码或不可达代码。它强调质量优先于数量,只有能构造具体利用请求时才报告发现。