mcpField
A
audit-security

audit-security

github.com/kensaurus安全939 次安装1 周前更新
代码仓库

关于 audit-security

audit-security 是一款用于审查应用代码安全问题的技能,在有限情况下也可就地修复有证据支持的问题。它强调追踪输入到风险点、记录发现,并将认证专项审查交由其他技能处理。

主要功能

  1. 01检查注入、响应头和依赖项
  2. 02追踪输入到风险点
  3. 03扫描秘密信息和依赖 CVE
  4. 04记录严重程度与证据
  5. 05将专项问题转交其他技能

适用场景

  1. 01发布前审计应用
  2. 02调查疑似注入或 IDOR
  3. 03检查泄露秘密信息和依赖风险

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kensaurus/skills --skill audit-security

安装后在 Claude Code 中输入/audit-security确认已加载。

详细介绍

安全审计技能

自由度:混合 — 步骤 0–4 的判断为 [高自由度]; 依赖项和密钥扫描为 [低自由度 — 按要求执行]。绝不编写漏洞利用 PoC。

审计并修复例外。 可以直接修复。仅规划待办 → plan-security-audit。 直接修复时:只在原位置修补有证据支持的风险点;注意到的无关弱点应作为问题写入报告,而不是修复。仅当仓库已有安全测试,或任务有要求时,才添加测试。身份验证行为、RLS、密钥轮换、支付和迁移都必须暂停并确认。

OWASP 静态审查(注入、标头、依赖项)。会话 / 路由×门控 / getSession() → audit-auth-flows。Next.js 16:搜索 middleware.ts 和 proxy.ts — 路由门控可能位于任一文件中,且代理层有其自身的一类绕过风险。

如何推理

  1. 观察 — 引用风险点或缺失的检查(文件:行号)
  2. 解读 — 不可信输入是否能到达查询、HTML 或对象 ID?
  3. 分类 — 注入 / IDOR / 密钥 / 标头 / 依赖项 CVE / 移交
  4. 严重程度 — 可利用的数据访问漏洞或硬编码密钥 = 严重

示例

观察: GET /documents/:id 仅按 ID 加载(api/docs/route.ts:18)。 解读: 任何能访问此路由的调用者都能读取其他用户的文档。 分类: IDOR。 严重程度: 严重。 问题: IDOR | /documents/:id | 添加 userId 谓词。 此路由上的 Matcher / getSession() → audit-auth-flows,而非此检查清单。

步骤 0:了解项目 [高自由度]

审计前,了解技术栈和攻击面:

  1. 阅读 package.json / requirements.txt / go.mod,以确定:
  • 身份验证库(next-auth、passport、supabase-auth、django-auth 等)
  • 数据库 ORM(Prisma、Sequelize、SQLAlchemy 等)
  • HTTP 框架(Express、Fastify、Django、Flask 等)
  • 任何特定安全用途的软件包(helmet、cors、csurf、rate-limit 等)
  1. 确定身份验证模式:
  • 基于会话、JWT 还是 OAuth
  • 令牌存储位置(cookies、localStorage、标头)
  • 权限/角色的执行方式
  1. 确定数据流:
  • 用户输入进入系统的位置
  • 数据的验证和清理方式
  • 数据到达数据库的路径

步骤 1:研究当前威胁 [高自由度]

获取针对检测到的技术栈的最新 OWASP 信息和安全最佳实践:

firecrawl:firecrawl_search
{
 "query": "<framework> security best practices OWASP <current year>",
 "limit": 5,
 "sources": [{ "type": "web" }]
}

针对相关平台抓取 OWASP Top 10:

firecrawl:firecrawl_scrape
{
 "url": "https://owasp.org/Top10/",
 "formats": ["markdown"],
 "onlyMainContent": true
}

还要检查依赖项中已知的 CVE:

firecrawl:firecrawl_search
{
 "query": "<package-name> CVE vulnerability <current year>",
 "limit": 5,
 "sources": [{ "type": "web" }]
}

步骤 2:检查生产环境安全错误(Sentry) [高自由度]

如果已配置 Sentry,请检查生产环境中与安全相关的错误:

sentry:search_issues
{
 "organizationSlug": "<ORG_SLUG>",
 "query": "401 unauthorized OR 403 forbidden OR CORS OR CSP violation in last 30 days",
 "projectSlugOrId": "<PROJECT_SLUG>",
 "regionUrl": "<REGION_URL>",
 "limit": 20
}

表明存在安全问题的模式:

  • 频繁出现 401/403 错误 → 可能有人尝试绕过身份验证
  • 来自意外来源的 CORS 错误 → CORS 配置错误
  • CSP 违规 → 存在潜在的 XSS 攻击向量
  • 速率限制错误 → 可能有人尝试暴力破解

步骤 3:自动化代码扫描 [高自由度]

身份验证审计
  • 密码使用 bcrypt/argon2/scrypt 哈希(密码不得使用 MD5/SHA1/SHA256)
  • 会话令牌经过密码学安全的随机生成
  • 会话在适当时间过期(空闲超时 + 绝对超时)
  • 密码重置令牌只能使用一次,且会快速过期
  • 为敏感账户提供 MFA
  • 已实现登录速率限制
  • 多次登录失败后锁定账户
  • 验证 OAuth state 参数(保护 OAuth 流程免受 CSRF 攻击)
  • JWT 密钥强度足够,并存储在环境变量中(不得硬编码)
  • JWT 过期时间合理(访问令牌:15 分钟,刷新令牌:7 天)
授权审计
  • 每个 API 端点都检查权限(而不仅是身份验证)
  • 不存在未经所有权/权限检查的直接对象引用(IDOR)
  • 在 API 层正确执行基于角色的访问控制(而不仅是在 UI 层)
  • 遵循最小权限原则
  • 管理员功能需要更高权限的身份验证
  • 为多租户数据库启用行级安全(RLS)
  • API 密钥仅授予所需的最低权限
输入验证审计
  • 所有用户输入都在服务端验证(客户端验证仅用于改善用户体验)
  • 在将输入用于查询、HTML、命令之前进行清理
  • 验证文件上传:类型(MIME + 魔数)、大小、文件名
  • JSON/XML 解析设置深度/大小限制
  • 解码并验证 URL 参数
  • 不拼接原始 SQL(仅使用参数化查询)
  • 不使用带有用户输入的 eval()、Function()、innerHTML
  • 不使用不带 DOMPurify 的 dangerouslySetInnerHTML
数据保护审计
  • 敏感数据在静态存储时加密
  • 强制使用 TLS/HTTPS(不回退到 HTTP)
  • 代码、git 历史记录和日志中不包含机密
  • 按照适用法规(GDPR、CCPA)处理个人身份信息(PII)
  • 数据库连接已加密(SSL)
  • API 响应不会泄露内部数据(堆栈跟踪、SQL 错误、文件路径)
  • 密码字段使用 type="password" 和 autocomplete="new-password"
安全标头审计
  • Strict-Transport-Security(HSTS)设置较长的 max-age
  • 已配置 Content-Security-Policy(CSP)(而非仅设置 default-src *)
  • X-Content-Type-Options: nosniff
  • X-Frame-Options: DENY 或 SAMEORIGIN
  • Referrer-Policy: strict-origin-when-cross-origin 或更严格的策略
  • Permissions-Policy 限制不必要的浏览器功能
  • 对于需要身份验证的端点,CORS Access-Control-Allow-Origin 不得为 *
  • Cookie:HttpOnly、Secure、SameSite=Strict(或 Lax)
依赖项审计 [低自由度 — 按原样执行]
npm audit # Node.js
pip-audit # Python
cargo audit # Rust
govulncheck ./... # Go
bundle audit # Ruby
  • 没有已知的高危/严重 CVE
  • 依赖项已更新到合理的新版本
  • 已提交锁定文件(package-lock.json、yarn.lock、pnpm-lock.yaml)
  • 没有不必要的依赖项(缩小攻击面)

步骤 4:常见漏洞模式 [高自由度]

搜索这些危险函数,然后结合上下文检查每个匹配项:

  • SQL 注入 — 将字符串插值到查询中(`SELECT … ${、+ userId +);通过参数化查询或 ORM 调用即可
  • XSS — 将用户输入传入未经 DOMPurify.sanitize 处理的 dangerouslySetInnerHTML/innerHTML
  • IDOR — 使用 req.params.id 加载数据,但查询中没有所有者条件(userId: req.user.id)
  • 敏感数据泄露 — 返回 res.json(user) 这类完整记录,而不是明确挑选字段

步骤 5:环境与机密 [低自由度 — 仅限名称/前缀]

搜索硬编码的机密

在代码库中搜索可能泄露的机密。请查找以下模式:

  • 通用机密名称:api_key、apiKey、secret、password、token、credentials、private_key
  • 密钥前缀:sk-、pk-、ghp_、gho_、xox[bpsa]-、AKIA
  • 私钥头:-----BEGIN (RSA|EC|OPENSSH) PRIVATE KEY-----
检查 .gitignore
.env, .env.local, .env.production
*.pem, *.key, *.p12
credentials.json, service-account.json
.sentryclirc (if it contains auth tokens)
验证环境变量
import { z } from 'zod';

const envSchema = z.object({
 DATABASE_URL: z.string().url(),
 API_KEY: z.string().min(1),
 JWT_SECRET: z.string().min(32),
 SENTRY_DSN: z.string().url().optional(),
});

const env = envSchema.parse(process.env);

应用修复前的自我审查 [低自由度 — 不要跳过]

  1. 有证据 — 提供 file:line 或审计输出,而不是“这里可能存在注入漏洞”
  2. 可复现 — 同一危险函数仍然存在;未编写漏洞利用 PoC
  3. 严重性有依据 — 严重 = 已证实可访问数据或机密已泄露
  4. 负责人正确 — session/route×gate/getSession → audit-auth-flows;RLS → plan-rls-audit;LLM → audit-llm-security
  5. 不制造虚假的安全感 — 仅有标头或中间件 ≠ 授权

输出:安全审计报告

## Security Audit: [Project Name]

### Tech Stack
- Framework: [name + version]
- Auth: [library + pattern]
- Database: [ORM + provider]
- Security packages: [list]

### Critical Issues (must fix)
| # | Category | Finding | File | Recommendation |
|---|----------|---------|------|----------------|
| 1 | Auth | JWT secret hardcoded | config.ts:12 | Move to env var |

### High Risk (should fix soon)
| # | Category | Finding | File | Recommendation |
|---|----------|---------|------|----------------|

### Medium Risk (improve when possible)
| # | Category | Finding | File | Recommendation |
|---|----------|---------|------|----------------|

### Passed Checks
- [list of security areas that are properly implemented]

### Dependencies
- Critical CVEs: [count] — [details]
- High CVEs: [count]
- Outdated packages: [count]

### Research Sources
- [URL] — [what it confirmed or revealed]

session / route×gate / getSession() 的发现应归入 audit-auth-flows, 而不是本 OWASP 清单。

评论

支持 Markdown