关于 security-review
面向开发者的代码安全审查技能,按流程覆盖攻击面梳理、OWASP 检查、修复建议、基础设施加固和 STRIDE 威胁建模。
主要功能
- 01梳理攻击面与数据流
- 02OWASP Top 10 审查清单
- 03认证与输入校验指导
- 04密钥和依赖项加固
- 05STRIDE 威胁建模
适用场景
- 01审查认证或会话变更
- 02检查新增 API 端点及用户输入
- 03评估依赖项与部署配置
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ pixel-process-ug/ superkit-agents --skill security-review安装后在 Claude Code 中输入/security-review确认已加载。
附带文件owasp-checklist.md
详细介绍
安全审查
概述
系统地审查代码中的安全漏洞,应用安全编码模式,并确保应用遵循纵深防御原则。本技能涵盖 OWASP Top 10、身份验证模式选择、输入验证、密钥管理、依赖项审计、安全标头和威胁建模。
开始时声明:“我正在使用 security-review 技能评估安全态势。”
阶段 1:范围界定与威胁评估
**目标:**识别攻击面,并确定审查重点的优先级。
操作
- 识别所有面向用户的端点和输入界面
- 梳理身份验证和授权边界
- 列出外部依赖项及其信任级别
- 识别敏感数据流(PII、凭据、支付信息)
- 确定合规要求(SOC 2、GDPR、HIPAA)
停止——在进入阶段 2 前,切勿继续:
- 已梳理攻击面
- 已识别敏感数据流
- 已了解合规要求
阶段 2:OWASP Top 10 审计
**目标:**按照每个 OWASP 类别进行系统检查。
OWASP Top 10 检查清单(2021)
| # | 类别 | 关键检查项 | 通过/失败 |
|---|---|---|---|
| 1 | 访问控制失效 | 在每个端点验证授权,默认拒绝 | |
| 2 | 加密机制失效 | 不存在明文密钥,使用强算法(AES-256、bcrypt) | |
| 3 | 注入 | 使用参数化查询,不通过字符串拼接构造 SQL/命令 | |
| 4 | 不安全设计 | 制定威胁模型,实施速率限制,考虑滥用场景 | |
| 5 | 安全配置错误 | 生产环境无默认配置,权限最小化,错误消息不泄露任何信息 | |
| 6 | 易受攻击的组件 | 审计依赖项,不存在已知 CVE,制定更新策略 | |
| 7 | 身份验证失效 | 提供 MFA,密码经过哈希处理,会话管理安全 | |
| 8 | 软件和数据完整性失效 | 验证签名,验证 CI/CD 流水线完整性 | |
| 9 | 日志记录和监控失效 | 记录身份验证事件、访问控制失败和输入验证失败 | |
| 10 | SSRF | 验证 URL/使用允许列表,不允许用户输入访问内部网络 |
停止——在进入阶段 3 前,切勿继续:
- 已检查全部 10 个类别
- 已记录问题及其严重程度
阶段 3:按类别深入审查
**目标:**针对已识别的问题应用详细的安全模式。
身份验证模式选择表
| 模式 | 适用场景 | 关键要求 |
|---|---|---|
| JWT | 无状态 API、微服务、移动后端 | 多服务场景使用 RS256;访问令牌最长 15 分钟;使用 HttpOnly Cookie |
| 基于会话 | 传统 Web 应用、服务端渲染页面 | 服务端存储;使用 HttpOnly + Secure + SameSite Cookie;使用 CSRF 令牌 |
| OAuth2/OIDC | 第三方登录、SSO、委托身份验证 | 使用 Authorization Code + PKCE;验证 ID 令牌声明;在服务端存储令牌 |
| Passkeys/WebAuthn | 无密码、高安全性应用 | 抵御网络钓鱼;仅存储公钥;支持每个账户使用多个密钥 |
JWT 安全检查清单
| 方面 | 指引 |
|---|---|
| 签名 | 多服务场景使用 RS256(非对称),单服务场景使用 HS256 |
| 有效期 | 访问令牌:最长 15 分钟。刷新令牌:最长 7 天 |
| 存储 | 使用 HttpOnly Cookie(Web)或安全存储(移动端)。切勿使用 localStorage |
| 刷新 | 每次使用时轮换刷新令牌,登出时使令牌失效 |
| 载荷 | 仅包含必要声明(sub、exp、iat、roles)。不得包含敏感数据 |
输入验证模式
允许列表验证(始终优先于阻止列表):
# Good: allow-list
ALLOWED_SORT_FIELDS = {'name', 'created_at', 'price'}
if sort_field not in ALLOWED_SORT_FIELDS:
raise ValidationError("Invalid sort field")
# Bad: block-list (always incomplete)
BLOCKED_CHARS = ['<', '>', '"']
参数化查询(绝不拼接用户输入):
# Good: parameterized
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
# Bad: SQL injection vulnerability
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
文件上传验证
- 在服务端验证 MIME 类型(不能只检查扩展名)
- 限制文件大小
- 生成随机文件名(绝不使用用户提供的名称)
- 将上传文件存储在 Web 根目录之外
- 如果接受不可信用户上传的文件,请扫描恶意软件
停止 — 在进入阶段 4 之前,不要继续:
- 所有已识别的问题都有修复建议
- 已正确应用身份验证模式
- 输入验证全面
阶段 4:基础设施与依赖项加固
**目标:**保护部署环境和供应链。
密钥管理规则
| 环境 | 方法 |
|---|---|
| 开发 | .env 文件(已在 git 中忽略) |
| CI/CD | 流水线密钥(GitHub Secrets、GitLab CI vars) |
| 生产 | 密钥管理器(AWS Secrets Manager、Vault、GCP Secret Manager) |
绝不可做的密钥操作
- 绝不在源代码中硬编码密钥
- 绝不将
.env文件提交到 git - 绝不记录密钥(即使在调试级别)
- 绝不将密钥作为命令行参数传递
- 绝不在不同环境中使用相同的密钥
依赖项审计命令
# Node.js
npm audit
npx socket-security audit
# Python
pip-audit
safety check
# Go
govulncheck ./...
# Rust
cargo audit
安全标头
| 标头 | 值 | 用途 |
|---|---|---|
Content-Security-Policy | default-src 'self'(根据应用自定义) | 防止 XSS、数据注入 |
Strict-Transport-Security | max-age=63072000; includeSubDomains | 强制使用 HTTPS |
X-Content-Type-Options | nosniff | 防止 MIME 嗅探 |
X-Frame-Options | DENY 或 SAMEORIGIN | 防止点击劫持 |
Referrer-Policy | strict-origin-when-cross-origin | 控制 referer 信息泄露 |
Permissions-Policy | 禁用未使用的 API | 限制浏览器功能访问 |
CORS 规则
- 绝不在携带凭据时使用
Access-Control-Allow-Origin: * - 将允许的来源加入白名单
- 将允许的方法和标头限制为所需范围
阶段 5:威胁建模(STRIDE)
**目标:**对于新功能或重大变更,逐一检查每类威胁。
| 威胁 | 问题 | 缓解措施 |
|---|---|---|
| 欺骗 | 攻击者能否冒充他人? | 强身份验证、多因素身份验证 |
| 篡改 | 数据能否在不被发现的情况下遭到修改? | 完整性检查、签名 |
| 抵赖 | 用户能否否认执行过某项操作? | 审计日志 |
| 信息泄露 | 敏感数据能否通过错误、日志或侧信道泄露? | 错误信息清理、加密 |
| 拒绝服务 | 系统能否被压垮? | 速率限制、资源配额 |
| 权限提升 | 用户能否获得其不应拥有的权限? | 最小权限、RBAC |
对于每项已识别的威胁:
- 记录威胁和攻击途径
- 评估可能性和影响
- 定义缓解措施
- 验证缓解措施已实施并经过测试
决策表:安全审查深度
| 变更类型 | 审查深度 | 重点领域 |
|---|---|---|
| 身份验证/会话变更 | 全面 STRIDE + OWASP | 所有类别 |
| 用户输入处理 | 重点关注注入和验证 | OWASP 1、3、10 |
| 依赖项更新 | CVE 扫描 + 更新日志审查 | OWASP 6 |
| 新增 API 端点 | 访问控制 + 输入验证 | OWASP 1、3、5 |
| 配置/基础设施 | 密钥 + 标头 + 错误配置 | OWASP 2、5 |
| 文件上传功能 | 注入 + SSRF + 恶意软件 | OWASP 3、10 |
反模式 / 常见错误
| 反模式 | 错误原因 | 正确做法 |
|---|---|---|
| 仅在客户端进行验证 | 容易绕过 | 始终在服务端进行验证 |
| 在 localStorage 中存储令牌 | XSS 可能窃取令牌 | 使用 HttpOnly Cookie |
| 使用阻止列表进行输入验证 | 阻止列表总是不完整 | 使用允许列表进行验证 |
| 在生产环境中使用通用错误消息 | 可能泄露内部详情 | 清理错误信息,在服务端记录详细信息 |
| 在不同环境中使用相同的密钥 | 一个环境遭到入侵会导致所有环境都受影响 | 为每个环境使用不同的密钥 |
| 忽略依赖项 CVE | 已知漏洞正遭到积极利用 | 定期审计并更新 |
| 在携带凭据时使用 CORS 通配符 | 会完全破坏 CORS 保护 | 将特定来源加入允许列表 |
| 记录敏感数据 | 日志泄露会导致数据泄露 | 切勿记录密钥、PII 或令牌 |
密钥轮换计划
| 密钥类型 | 轮换频率 | 怀疑密钥泄露后 |
|---|---|---|
| API 密钥 | 每 90 天 | 立即 |
| 数据库密码 | 每 90 天 | 立即 |
| 加密密钥 | 每年(支持密钥版本控制) | 立即 |
| JWT 签名密钥 | 每 6 个月 | 立即 |
| OAuth 客户端密钥 | 每 90 天 | 立即 |
子 Agent 派发机会
| 任务模式 | 派发给 | 适用时机 |
|---|---|---|
| 并行扫描不同的 OWASP 类别 | Agent 工具,使用 subagent_type="Explore"(每个类别一个) | 审查涵盖多种漏洞类型的大型代码库时 |
| 分析身份验证流程 | Agent 工具,使用 subagent_type="general-purpose" | 身份验证实现涉及多个文件或服务时 |
| 扫描依赖项漏洞 | Bash 工具,使用 run_in_background=true | 并发运行 npm audit 或类似工具时 |
派发时请遵循 dispatching-parallel-agents 技能协议。
集成点
| 技能 | 关联方式 |
|---|---|
code-review | 安全发现属于 Critical 类问题 |
senior-backend | 后端加固遵循安全审查发现 |
senior-fullstack | 身份验证实现遵循安全模式 |
acceptance-testing | 安全要求转化为验收标准 |
performance-optimization | 速率限制兼顾安全性和性能 |
systematic-debugging | 安全事件会触发调试工作流 |
技能类型
灵活——根据决策表,按变更类型调整审查深度。对于任何身份验证或输入处理变更,强烈建议使用 OWASP 检查清单和 STRIDE 分析。密钥管理规则不可妥协。
评论
支持 Markdown