安全审计 是做什么的?
查找违反真实信任边界的漏洞,然后向所有者提供源证据、安全复现方法、优先级和最小有效修复方案。这是一项防御性、以源代码优先的工作流程。没有具体受影响主体、资源或安全结果的候选发现不算确认的发现。
运行模式
此技能默认作为指导。加载它并不授权完整的审计工作流程或文件创建。
- 指导模式:对于安全问题、聚焦审查、方法论、分类或对特定发现的调查,仅使用此技能的相关部分。不要自动运行所有六个阶段、创建输出目录或编写审计产物。当有用时,你可以启动聚焦的代理;它们将结果返回给当前任务。
- 完整审计模式:当用户明确要求审计或渗透测试代码库、要求进行全面、综合或端到端的安全审查,或请求报告产物时,使用完整工作流程。运行所有六个阶段并写入下面定义的文件。
如果请求可能对应任一模式,请在创建文件或启动完整工作流程之前提出一个聚焦的问题。
平台术语
此技能是代理中立的:
- 父代理 是协调运行并拥有共享状态的代理。
- 任务工具 是平台的委派或子代理机制。
research代理 是用于聚焦源代码探索和事实验证的委派代理。general代理 是用于广泛调查和受限本地执行的委派代理。- 标题中的
subagent_type:表示执行该工作的两个委派代理角色中的哪一个。
在保持角色、写入隔离、提示和独立性边界的前提下,使用等效的平台能力。
通用执行安全
这些规则适用于两种运行模式。源代码检查是只读的。仅在操作系统强制执行的沙箱中运行目标控制的构建、测试、进程、浏览器、模拟器、模糊测试器和夹具处理,该沙箱提供以下所有控制:
- 没有外部网络;当检查需要本地客户端/服务器流量时,仅使用隔离的回环命名空间;
- 一个空的环境,从显式的允许列表中填充安全值,使用沙箱本地的
HOME、临时目录和缓存; - 只读的目标和工具链,目标控制的进程只能在其分配的
scratch/目录内写入;以及 - 明确的低 CPU、内存、进程、文件大小、磁盘和墙钟限制。
代理(在目标控制的进程之外)可以在分配的 scratch/ 目录中创建一次性的源代码副本,当构建需要与源代码并排写入时。在指导模式下,不要保留目标控制的文件。在完整审计模式下,只有受信任的父代理侧代码可以使用写入隔离下的程序将最少的非秘密结果提升到保留的 artifacts/。永远不要向目标代码暴露保留的输出目录(除了代理自身分配的 scratch/)、另一个代理的目录、主机的家目录、凭据、套接字或共享服务。不要安装依赖项或让构建获取它们。仅使用本地已可用的工具和依赖项。如果无法强制执行每一项控制,则不要执行目标代码:将缺失的沙箱能力报告为需要验证的阻塞项,并给出安全的验证计划。
使用虚拟的主体、夹具和秘密。不要探测已部署的端点、外部服务、共享基础设施、生产身份、其他用户的数据或实时控制平面。不要针对实时或共享进程测试可用性、发布产物、更改版本、消耗付费 API 配额,或在建立缺陷所需的最小本地影响之外继续操作。如果决定性事实位于源代码或沙箱夹具之外,则将其报告为需要验证。
完整审计设置
在完整审计模式下,在侦察之前解析这些值:
- 技能目录:包含此
SKILL.md的绝对目录。 - 目标:正在审查的绝对仓库根目录。
- 仓库名称:来自目录或本地 Git 远程的稳定仓库标识符。
- 输出目录:目标之外的一个新的可写目录,默认为
~/security-audit-skill/<repo-name>/run-<N>,其中<N>是下一个未使用的整数。仅当用户明确选择且父代理验证版本控制忽略整个目录时,才使用目标内部的目录。否则停止并请求一个外部路径。 - 源引用:审查的提交以及工作树是否脏。不要将未审查的生成或修改文件视为另一个修订版本。
写入隔离
父代理创建共享运行文件,并且是唯一的写入者:
run-metadata.jsonarchitecture.mdcoverage-ledger.jsonfindings.jsonREPORT.mdFINDINGS-DETAIL.mdNEEDS-VALIDATION.md
每个猎人(hunter)或验证器(verifier)接收一个唯一的根目录,位于 <output-dir>/agents/<agent-id>/ 下,具有独立的 scratch/ 和 artifacts/ 目录。规范的代理 ID 匹配 ^[a-z0-9][a-z0-9_-]{0,63}$,并且不得等于 Windows 设备名称,如 con、prn、aux、nul、com1 到 com9 或 lpt1 到 lpt9。小写 ID 防止大小写折叠冲突。代理及每个目标控制的进程只能写入 scratch/;保留的 artifacts/ 由父代理拥有,永远不暴露给沙箱,并且仅可由受信任的父代理侧提升代码写入。代理不得更改共享文件、目标源代码、保留的产物或另一个代理的目录。不要使用 /tmp 或主机的家目录作为可写的后备目录。
在执行之前,父代理打开并保留受信任的、不可继承的目录描述符,用于代理的 scratch/ 和 artifacts/ 根目录,并记录预期的 scratch 相对产物文件的允许列表以及显式的每文件和累积字节限制。切勿将这些描述符传递给代理或沙箱。在沙箱及其所有进程终止后,受信任的父代理侧代码分别提升每个允许列表中的文件:
- 验证声明的相对路径:拒绝绝对路径、空路径、
.、..或符号链接组件。 - 从保留的
scratch根描述符开始,使用无跟随的目录相对操作遍历每个父组件;切勿通过路径重新打开。 - 以无跟随和无阻塞方式打开叶子节点。
- 使用
fstat验证它是一个常规文件,链接计数恰好为 1,并且在记录的每文件和累积字节限制内。 - 在从该描述符读取时再次强制这些限制。
- 复制恰好验证的大小,重复
fstat,如果标识、类型、链接计数或大小发生变化则拒绝。 - 对于目标,从保留的
artifacts根描述符开始,使用无跟随的目录相对操作遍历每个父组件;要求每个现有组件都是真实的目录,并在重新打开和验证其为无跟随之前,独占创建任何缺失的目录。 - 以无跟随方式独占创建叶子节点,验证打开的目标是一个常规文件且链接计数恰好为 1,然后从已验证的源描述符复制,不重新打开任何路径。
- 在非 POSIX 系统上使用等效的竞态安全 API。
- 绝不要递归复制或全局匹配
scratch、将归档文件提取到artifacts、打开或提升符号链接、FIFO、套接字、设备、目录、硬链接文件、正在更改的文件或超过其限制的文件。 - 如果任何检查不可用、无法执行或失败,则丢弃
scratch条目;如果它是决定性证据,保留为 `needs_v