security-audit

security-audit

热门

对代码库进行安全审计——涵盖 Web 应用、API、服务、CLI 工具、库、守护进程等。当被要求查找安全漏洞、进行安全审查、审计漏洞或对代码进行渗透测试时使用。重点关注可利用且具有实际影响的问题,而非理论问题或行业标准行为。

2713Star
198Fork
更新于 2026/7/6
SKILL.md
readonly只读
name
security-audit
description

对代码库进行安全审计——涵盖 Web 应用、API、服务、CLI 工具、库、守护进程等。当被要求查找安全漏洞、进行安全审查、审计漏洞或对代码进行渗透测试时使用。重点关注可利用且具有实际影响的问题,而非理论问题或行业标准行为。

安全审计

你是一名安全审计员。你的工作是发现具有实际影响的可利用漏洞

平台术语

本技能与代理无关。在方法论中:

  • 任务工具 指编码代理的委派或子代理机制。
  • research 代理 指被委派用于专注代码库探索和事实核查的代理。
  • general 代理 指可以广泛调查并生成专注研究代理的委派代理。
  • subagent_type 指当前平台支持的等效委派代理角色。

使用平台的等效能力,同时保留指定的角色、并行性、提示词和独立性边界。

设置

开始之前,确定两个路径:

  • 目标:要审计的代码库(来自用户请求或当前工作目录)
  • 输出目录:所有审计产物存放的位置。如果未指定,询问用户,或默认使用 ~/security-audit-skill/<repo-name>/run-<N>,其中 <N> 是下一个未使用的整数(用 ls 检查已存在的内容)。如果目录不存在则创建它。这确保对同一仓库的多次运行产生独立结果。

审计期间写入的所有文件都放在输出目录中:

  • architecture.md — 阶段 1 的输出,供阶段 2 代理提示使用
  • REPORT.md — 人类可读的报告(阶段 4)
  • FINDINGS-DETAIL.md — 中危及以上发现的详细数据流(阶段 4)
  • findings.json — 机器可读的结构化输出(阶段 5)

子代理(阶段 1、2、3、6)不写文件——它们通过任务工具将结果返回给你。你负责将所有文件写入输出目录。

覆盖范围和先前运行

每次审计运行根据代理发现的内容和挖掘的位置探索不同的代码路径。没有单次运行能发现所有问题。测试表明,最佳的单次运行大约能发现多次运行中总漏洞的一半。

如果同一仓库存在先前运行(检查 ~/security-audit-skill/<repo-name>/),在开始阶段 2 之前阅读它们的 findings.json 文件。使用它们来:

  1. 跳过已知发现 — 不要让代理浪费时间重新发现相同的状态绕过。在报告中提及先前发现,但将狩猎重点放在新领域。
  2. 针对缺口 — 如果先前运行主要关注注入和认证,本次运行应侧重于业务逻辑、创造性攻击和通配代理。如果先前运行遗漏了公共端点,则重点关注那里。
  3. 解决分歧 — 如果先前运行对同一发现给出冲突的结论,则明确验证它。

在架构摘要中包含先前运行的简要总结,以便阶段 2 代理知道已经发现了什么。

如果没有先前运行,在报告中注明覆盖范围会随着额外运行而提高,并建议用户再次运行审计以捕获本次运行可能遗漏的发现。

核心原则

只报告你能利用的问题

每个发现必须有具体的攻击场景:攻击者是谁,他们做什么,他们得到什么?"攻击者理论上可以……"不是发现。"发送此请求,得到此结果"才是。

尽可能动态确认

这是以源代码优先的审计,但你能执行的声明胜过只能论证的声明。如果目标可以在本地构建——解析器、库、CLI、原生组件——构建并运行它:复现崩溃,运行载荷,对比两个解析器对相同字节的处理。更好的是,将可疑代码提取到最小的独立测试工具中,并隔离测试假设——模糊测试那个函数,喂入构造的输入,观察它的行为。如果需要你无法获得的基础设施——代理链、实时缓存、生产认证——则无法仅从源代码确认:标记为"需要部署测试",不要报告为已确认。动态证据是解决内存安全和请求分帧类问题的关键,这些类问题静态阅读无法明确。

动态确定基线

在阶段 1 中,确定这个应用程序是什么,存在哪些类似的应用程序。使用这些类似物来校准——不是用来否定发现,而是用来集中精力。如果类似物有相同的模式并且在那里被利用过,那是一个更强的发现,而不是更弱的。如果类似物有相同的模式并且 20 年来从未被利用过,你应该在报告之前理解为什么。

不要硬编码特定的类似物。CMS 与其他 CMS 比较。API 网关与其他 API 网关比较。新颖的应用程序可能没有有意义的类似物。

纵深防御缺口不是漏洞

如果层 A 阻止了攻击,层 B 的缺失是加固说明,而不是发现。如果你想,可以单独报告,但不要夸大其严重性。

严重性需要影响

严重性是可能性(利用难度、所需访问权限)和影响(造成的损害)的组合。使用两个轴:

  • 严重:未认证的 RCE、完整数据库转储、无凭据的管理员账户接管
  • :已认证的 RCE、带数据泄露的 SQL 注入、对所有用户触发的存储型 XSS、认证绕过。此外:任何发现中 RBAC/权限模型被完全击败的操作——例如,用户能执行系统明确限制为更高角色的操作,并且该操作有实际后果(发布内容、删除资源、修改其他用户的数据)。
  • :需要特定条件的定向 XSS、具有有意义状态变更的 CSRF、秘密/凭据的信息泄露。此外:具有实际但有限后果的业务逻辑绕过——例如,操作可行但需要认证,或影响限于攻击者自己的数据,或绕过需要不常见条件。
  • :非秘密数据的信息泄露、需要持续努力的 DoS
  • 信息:已确认但影响最小的观察,没有独立的利用——主要作为另一个发现的构建块。纯纵深防御缺口属于加固说明,不在此处。

业务逻辑发现中高和中的关键区别:该发现是否击败了明确的安全边界? 击败一个——超越系统明确执行的角色行事——是高;数据不一致、需要特权访问才能利用的发现,或爆炸半径有限的发现是中。

如果你无法描述攻击者实现的具体损害,严重性可能比你想象的要低。

这些原则由 HUNTING.md 中的验证规则在操作上强制执行——这是每个猎人在报告发现之前应用的标准,阶段 3 会对抗性地重新应用。领域配套文件在此基础上添加领域特定的检查;它们不取代它。

工作流概述

按顺序遵循所有六个阶段:

  1. 侦察 — 从 RECONNAISSANCE.md 运行阶段 1,绘制应用程序的架构、信任边界和输入面。
  2. 狩猎 — 使用 HUNTING.md 进行阶段 2 的编排、方法和验证规则;从 ATTACK-CLASSES.md 中选择范围,该文件将原生、AI/LLM、HTTP 协议/认证和客户端目标路由到专门的配套文件(MEMORY-SAFETY-AND-BINARY.mdAI-AND-LLM.mdWEB-PROTOCOL-AND-AUTH.mdCLIENT-SIDE.md)。
  3. 验证 — 使用 VALIDATION-AND-REPORTING.md 中的阶段 3 合并重复项并独立尝试反驳每个发现。
  4. 报告 — 使用 VALIDATION-AND-REPORTING.md 中的阶段 4 编写 REPORT.mdFINDINGS-DETAIL.md
  5. 结构化输出 — 使用 VALIDATION-AND-REPORTING.md 中的阶段 5、report-schema.jsonvalidate-findings.cjs 编写并验证 findings.json
  6. 独立验证 — 使用 VALIDATION-AND-REPORTING.md 中的阶段 6 验证每个事实声明并协调所有输出。

要避免的反模式

这些是使安全审计无用的错误:

  1. 将偏离 OWASP 的所有内容列为发现。 OWASP 是检查清单,不是错误列表。每个真实应用程序都会做出权衡。
  2. 将纵深防御缺口评为高/严重。 "查询构建器已经引用标识符,但缺少 validateIdentifier" 不是高严重性。
  3. 忽略部署模型。 CDN 层的速率限制是有效的架构。并非每个应用都需要应用层速率限制。
  4. 将设计行为视为错误。 在审计之前理解信任模型。如果设计说管理员完全受信任,那么管理员做管理员的事情不是发现。
  5. 用低危发现填充报告以显得彻底。 十个低危发现不会使报告有用。三个中危发现会。
  6. 没有证据的"潜在"发现。 要么你能利用它,要么不能。如果你需要"潜在"或"理论上"这些词,你还没有做足够的研究。
  7. 忽略代码库做得好的地方。 如果认证很扎实,就说出来。这能建立对你报告发现的信任,并帮助团队确定优先级。
  8. 基于错误的解析器/运行时假设构建利用。 最令人信服的误报来自"解析器/运行时会将其解释为……"而没有验证。如果你的利用依赖于解析器或运行时行为,请引用规范或测试它。不要假设。
  9. 跳过业务逻辑和创造性攻击。 标准漏洞类别(SQLi、XSS、SSRF)是每个扫描器都会检查的。手动审计的价值在于发现扫描器无法发现的东西:逻辑错误、状态机违规、链式攻击、隐式信任假设。
  10. 轻易放弃。 "代码库使用参数化查询,所以没有 SQL 注入"是懒惰的结论。检查每个 sql.raw() 的使用。检查动态标识符。检查搜索/FTS。检查是否有绕过查询构建器的代码路径。推动。