用途
该技能用于在合并或发布代码前进行安全审查,尤其当变更涉及不可信输入、认证、授权、密钥、SQL 等敏感面时。其核心主张是:多数安全审查输出之所以无用,是因为只点名类别而不给出路径。"验证所有用户输入"对任何程序都成立,却改变不了任何事。有用的发现是一条路径:攻击者控制的输入、承载它的代码、它到达的操作,以及攻击者最终获得什么。
核心原则:跟随数据,而不是对照检查清单。漏洞存在于值进入的位置与它起作用的位置之间的空隙。
配套技能:requesting-code-review 用于一般审查循环,systematic-debugging 用于确认利用路径。
铁律
没有从攻击者可控输入到影响的路径,就不构成发现。
如果你无法说出输入是什么、它经过什么路径、对运营者造成什么代价,那只是一个代码异味——归入观察项,而非发现项。用类别化建议填充报告,会埋没唯一真实的路径。推论:在报告前,必须在实际代码中追踪路径。grep 命中只是线索,不是发现。
主要能力
技能按以下步骤组织审查:
-
梳理攻击面——入口点、谁能到达、以什么权限运行。包括 HTTP 路由、gRPC 方法、队列或事件消费者、文件上传与导入、Webhook 接收器、CLI 标志与环境配置、LLM/工具输出。其中模型输出被视为不可信输入:如果文档、网页或先前工具结果能引导模型调用工具,那么该工具到达的每个危险操作都是攻击者可到达的。
-
追踪输入到危险操作——SQL/查询构建器、Shell/进程启动、文件系统路径、出站 HTTP、模板渲染、反序列化、归档解压、重定向目标、用户输入上的正则、eval/反射/动态导入。强调跨边界跟随值:在边缘验证、存储、再读回并信任是常见遗漏,存储不是净化。
-
授权——被认为是真正漏洞所在。要求每个接收 ID 的处理器验证调用者可访问该对象,而不仅是已登录;检查在数据实际经过的路径上;租户/组织范围限定在查询中而非取回后;不信任请求体中的角色、租户、价格或用户 ID;默认拒绝;状态变更操作不可通过 GET 到达;多步流程每步重新检查授权。
-
密钥与加密——源码、提交到 git 的配置、日志、错误消息、URL 或客户端可见包中无密钥;git 历史中无密钥,曾提交过的必须轮换;密码用 argon2id/scrypt/bcrypt 哈希;令牌与签名用常量时间函数比较;令牌、ID、盐使用 CSPRNG;JWT 验证签名、固定算法、检查 exp/aud/iss;不关闭 TLS 验证;会话令牌在权限变更时轮换;Cookie 设置 HttpOnly、Secure、SameSite;不手写加密原语。
-
进程与插件边界——子进程只继承所需环境;工作目录、打开的文件描述符和网络访问是刻意设定的;子进程输出作为数据解析,绝不作为可信指令重新进入;存在超时、内存、输出大小等资源限制;失败时关闭;工具表面本身就是安全边界。
-
依赖——提交并遵守锁文件;咨询扫描干净或每个例外有书面可达性论证;新直接依赖检查年龄、维护、下载量和名称仿冒;审查安装/后安装脚本;CI 动作固定到 SHA。
-
数据暴露——返回客户端的错误不含堆栈、SQL、文件路径或内部主机名;日志不含密码、令牌、会话 ID、完整卡号或超出需要的 PII;调试端点在生成环境禁用或加门;CORS 不将通配来源与凭据组合;认证响应不被共享缓存;对象存储桶默认私有;时序与错误消息差异不泄露账户是否存在。
-
运行扫描器,然后验证——扫描器输出是线索列表,不是报告。报告任何扫描器命中前,确认它在当前代码库中可达。
使用方式
技能以检查清单和命令示例指导审查,例如枚举处理器与消费者、查找接收标识符的处理器、运行 gitleaks、govulncheck、npm audit、pip-audit、semgrep 等。严重性按可利用性分级:Critical(未认证攻击者获得代码执行、凭据或批量访问他人数据,无异常前置条件)、High(已认证攻击者提权、读写其他租户数据或提取密钥)、Medium(需要异常前置条件或产出有限数据)、Low(加固项,真实弱点但当前无演示路径)。报告格式包含范围、Critical、High、Medium/Low、观察项、已验证干净项、评估(是否可发布及理由)。
适用场景
合并或发布前的代码安全审查;变更触及不可信输入、认证、授权、密钥、SQL 等;需要以可利用路径而非类别清单来组织安全发现时。
限制
技能明确列出不应报告的内容:无危险操作的"添加输入验证"、未点名可滥用端点的缺失速率限制、无浏览器客户端的服务上缺失浏览器安全头、测试/夹具/示例代码中的发现、未确认可达的扫描器输出、无威胁的加密偏好细节、任何你会用"理论上"描述的内容。常见错误包括:清单式审查而非路径审查、止步于入口点、盲目信任框架、把已认证当作已授权、把模型当作可信、为显得彻底而夸大严重性。