Neatbo.

区分工作流声明与实际令牌权限

用明确来源和未解状态让本地工作流审查可复核,不虚构实际运行权限。

先让声明审查有用,再得出结论

把权限声明写明确是一项具体维护任务。Viper 问题涉及三个工作流中的六个 job;本地审查可以指出哪些 job 继承策略、哪些有自己的映射,却不能证明报告者的漏洞主张、检查实际令牌或在未记录仓库设置的文件里补出设置。

T303 记录单份真实快照及其哈希。这个边界有实际价值:未知默认值成为可见待审项,不是猜测授权;用户默认值带着未经验证的来源标志。交给了解仓库配置的维护者时,结果仍然可以正确理解。

分清这些结论
证据能支持的结论后续工作
明确 job 映射声明权限,省略项 none检查每项请求权限是否必要
没有明确策略默认未知或用户上下文核验企业、组织与仓库默认设置
uses 或条件原只读声明与来源位置审查引用代码和运行事件上下文
精确 needs 环这些字面 job ID 构成环修正文件并在实际环境验证工作流

策略替换与累积授权不同

workflow 和 job 映射不是两份可以求并集的清单。已核验样本里,deploy 要求 id-token: write,不继承 workflow 的 contents: read,省略的 contents 为 none。empty 使用 {},具有明确的全部 none 策略。简单收集每个权限词会丢掉这种语义。

被选中的策略旁应保留来源。全局模式也要保留字面声明:read-all 或 write-all 的 scopes=null 说明工具没有假装枚举实时权限。策略可以声明完整,同时运行限制仍未知。

未解依赖也值得一条记录

删除缺失目标或矩阵表达式会让图看起来整洁,却让审查不准确。完整导出保留所有 needs,区分缺失/表达式问题和精确已有 ID 的边。每个 job/step uses、原条件和矩阵同样保留,不运行。

六 job 示例包含一个两成员环和一个下游依赖;只有 cycleA/cycleB 属于环。下游仍需检查,因为它引用了缺失 job 与未解表达式。交接时这些问题应保持可区分。

  • 把包括 run 文本的原 job 映射与推导字段一同保留。
  • 形成声明报告不需要访问本地或远程动作路径。
  • 把用户默认值当作上下文,而非已验证的仓库设置。
  • 不同工作流使用不同快照,不推断跨文件运行行为。

有界预览仍可交付完整审查

较大工作流的数据可能超过窄屏能展示的范围。预览限制行和单元格,下载 JSON/CSV 保留所有 job。独立读回会重算权限来源、全部声明/边/uses,检查每个 CSV 行,包括真实合并的 1,000 job/10,000 边/10,000 uses 输入。

明确拒绝同样是可靠交接的一部分。不支持集合、重复键与循环别名不能变成貌似空的成功。多文档整体失败,不会静默忽略后面的工作流。5MiB 以内的源文件仍可能超过独立的 10MiB 下载预算。失败或真实取消后修正源文件,或重跑同一支持输入;不会提供部分成功工件。

参考资料

本分类工具使用说明

展开工具,查看操作步骤、可调选项和支持范围,再直接进入工作区。

GitHub Actions 权限与任务依赖审查审查单份本地 workflow 声明的令牌权限、实际 needs 边、环与动作引用,导出完整 JSON 和 CSV。

选择一份 UTF8 YAML1.2 工作流快照。根据 workflow 声明或明确提供但未经验证的仓库默认值,解析 job 的权限映射。缺省值保持未知,全局模式保留原声明;只审查依赖和 uses,不运行表达式、不联系 GitHub。

操作步骤

  1. 从自己的仓库复制并选择一份 workflow YAML。
  2. 默认保留未知;只有明确掌握仓库设置时才提供上下文,选择 JSON 映射后才解析文本框。
  3. 检查权限来源、省略项 none、缺失或未解析的依赖,以及精确环成员。
  4. 下载完整 JSON/CSV 与每个 job 的原声明;仓库设置和实际运行权限需另行核验。

可调选项

仓库默认权限上下文
未知 · 声明 read-all 上下文 · 声明 write-all 上下文 · 明确 JSON 映射

仅为用户明确提供的上下文,不查询仓库、不做实时验证。

明确的默认权限 JSON
{}

只在选择 JSON 映射时解析;4KiB 文本预算始终生效。映射省略项为 none。

能力与限制

  • 单文件最多 5MiB;解析后 YAML 值节点 100,000 个、深度 64、job 1,000 个、needs 声明和 uses 各 10,000 个。默认权限 JSON 最多 4KiB;完整 JSON/CSV 合计 10MiB。各项限制同时生效。只预览前 200 个 job,每格最多 2,000 个 UTF16 字符;下载保留全部记录。
  • 只支持单份 YAML1.2 core 文档、唯一字符串映射键、普通映射/数组/标量和无环别名。yaml2.9.1 的加权别名展开保护值为 50,不承诺支持 50 次字面引用。自定义/Set/二进制/日期标签、YAML1.1、环、重复键、非有限数、不安全整数和未知权限键会让整份审查失败。
  • 权限键固定于 2026-10-07 配置。job 映射替换 workflow 映射;省略的权限为 none,{} 表示全部 none。缺少默认值仍未知,用户提供的默认值仍未验证。read-all/write-all 保留字面模式,不虚构逐项实际权限。
  • 只读单份已提供快照,不是完整 workflow 模式验证、安全结论或实时令牌测试。fork、Dependabot、可复用工作流和仓库限制仍未知。矩阵、条件、needs 表达式与 job/step uses 只保留原文;不抓取动作、不改仓库、不请求网络、不运行脚本。取消后丢弃全部结果。
打开GitHub Actions 权限与任务依赖审查 →