audit-safety 是一个安全审计技能,针对 Web 应用(如 TanStack Start、Next.js、Convex 或类似框架)中的单个功能进行只读安全审计。它审计的范围是某一功能在服务端可达的完整外围,包括页面、loader、服务端函数、API 路由、Webhook、中间件和数据。该技能默认只读,除非用户在审计完成或存档后单独授权修复;它不实时测试生产环境、不创建账号、不修改数据。
用途
- 对一个指定功能进行安全审计,覆盖从入口到服务端执行点的完整路径。
- 帮助发现鉴权缺失、越权、租户/所有权绑定缺失、客户端权限检查无效、Webhook 签名验证缺失、密钥泄漏、公开读取字段过多、错误信息泄漏、敏感操作未限流等问题。
主要能力
- 推断最小完整审计范围:优先使用用户指定的功能、URL 或路径;否则选择一个连贯的当前改动功能;否则使用对话上下文。仅在安全边界上扩展,例如父级 beforeLoad/loader、被调用的服务端函数(createServerFn、server actions、Convex query/mutation/action/httpAction)、鉴权/租户/角色/令牌/错误中间件、schema/ORM/缓存/任务/Webhook、浏览器 DTO 以及针对性访问测试。
- 在判断前阅读仓库规则、鉴权原语、路由辅助函数、权限定义、使用的 schema 和代表性测试,并优先采用本地已有的防护措施。
- 始终打开 references/audit-checklist.md。
- 为每个操作构建可访问性矩阵:入口与方法、预期行为者、鉴权、租户/资源/所有权绑定、角色/权限/令牌范围、输入 schema、敏感输出、权威执行点、测试证据。父布局或隐藏按钮不能授权可调用的服务端函数或 API 路由。
- 重点检查:每个服务端函数、Convex 函数和 API 路由是否自行执行鉴权(公开的 Convex query/mutation 可被任何拥有部署 URL 的人调用);来自参数、表单、JSON、请求头和 Cookie 的 ID 在服务端绑定前是否被视为攻击者可控;客户端角色检查是否不提供任何保护;支付 Webhook(Stripe)是否在原始请求体上验证签名、是否幂等、是否从已验证事件授予访问权限而非成功 URL;密钥(sk_live_、sk_test_、API 令牌)是否从未进入浏览器包或 VITE_/NEXT_PUBLIC_ 变量;公开读取是否返回显式字段列表;错误是否从不泄漏密钥、堆栈跟踪或内部 URL;鉴权、OTP、上传、邮件和 AI 操作是否限流。
- 仅当存在从入口到执行点的具体路径和 file:line 时才报告发现。状态分为 CONFIRMED(已确认)、DEFENSE GAP(防御缺口)或 NOT VERIFIED(未验证)。不从文件名、grep 命中或缺少首选辅助函数推断可利用性。遵循包装器实现。鉴权、租户、所有权、角色、权限和验证不可互换。
- 报告以发现开头,按严重性从高到低排列:严重性、状态、操作、证据、影响、最小安全修复、回归测试场景。然后是矩阵、覆盖缺口、已检查文件,以及在无发现被证明时明确的“无发现”结论。
- 停止,不静默扩大为全仓库审查。
使用方式 该技能以审计指令形式使用,用户指定要审计的功能或范围。技能会先声明推断的范围,仅在两个范围同样合理时才询问。审计过程只读,不实时测试生产、不创建账号、不修改数据。
适用场景
- 对 Web 应用单个功能进行上线前安全审查。
- 检查服务端函数、API 路由、Convex 函数是否缺少鉴权。
- 检查 Stripe Webhook 签名验证与幂等性。
- 检查前端密钥泄漏与公开读取字段过多。
- 检查敏感操作是否限流。
限制
- 仅审计一个功能,不扩展为全仓库审查。
- 默认只读,不修改代码或数据。
- 修复需用户单独授权。
- 具体支持的框架以描述中列举的 TanStack Start、Next.js、Convex 或类似框架为准;其他平台暂未提供明确说明。
- 官方文本暂未提供。