GitHub Actions安全漏洞:PyPI发布工作流中的表达式注入风险

文章详细分析了PyPI发布GitHub Actions中存在的表达式注入安全漏洞。该漏洞源于GitHub Actions表达式在可被攻击者控制的上下文中使用,可能导致恶意代码在运行Docker容器的步骤中执行。文章详细解释了漏洞的技术原理、触发条件和潜在影响,并提供了相关的修复建议和参考信息。

漏洞概述

安全漏洞ID:GHSA-vxmw-7h4f-hqxh

漏洞类型:低危安全漏洞(Low severity)

影响范围:PyPI发布GitHub Actions(pypa/gh-action-pypi-publish)版本低于1.13.0

修复版本:1.13.0及以上

漏洞发现时间:2025年9月4日发布

漏洞详细描述

漏洞原理

gh-action-pypi-publish是一个用于将Python分发包上传到PyPI的GitHub Actions。该操作中的复合动作步骤set-repo-and-ref使用了GitHub Actions表达式扩展(即${{ ... }}),而这些表达式是在攻击者可能控制的上下文中使用的。

根据调用gh-action-pypi-publish的触发器类型,攻击者可能能够在调用该操作的工作流步骤中执行任意代码

技术细节

存在漏洞的代码位于action.yml文件的第114-125行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
- name: Set repo and ref from which to run Docker container action
  id: set-repo-and-ref
  run: |
    # Set repo and ref from which to run Docker container action
    # to handle cases in which `github.action_` context is not set

    REF=${{ env.ACTION_REF || env.PR_REF || github.ref_name }}
    REPO=${{ env.ACTION_REPO || env.PR_REPO || github.repository }}
    REPO_ID=${{ env.PR_REPO_ID || github.repository_id }}
    echo "ref=$REF" >>"$GITHUB_OUTPUT"
    echo "repo=$REPO" >>"$GITHUB_OUTPUT"
    echo "repo-id=$REPO_ID" >>"$GITHUB_OUTPUT"
  shell: bash
  env:
    ACTION_REF: ${{ github.action_ref }}
    ACTION_REPO: ${{ github.action_repository }}
    PR_REF: ${{ github.event.pull_request.head.ref }}
    PR_REPO: ${{ github.event.pull_request.head.repo.full_name }}
    PR_REPO_ID: ${{ github.event.pull_request.base.repo.id }}

问题根源

  1. 这些表达式使用${{ ... }}语法,而不是${...}(即正常的shell插值)
  2. 这可以绕过正常的shell引号规则
  3. 如果env.ACTION_REFenv.PR_REF都评估为空字符串,则表达式会回退到github.ref_name,这可以是通过分支或标签名设置的攻击者控制的字符串

攻击示例

如果攻击者能够将分支名称设置为类似innocent;cat${IFS}/etc/passwd的内容,那么REF行可能扩展为:

1
REF=innocent;cat${IFS}/etc/passwd

这将把REF设置为innocent,然后运行攻击者的代码。

背景问题

漏洞影响分析

影响范围

该漏洞的影响非常低,因为在正常操作中,相关表达式不太可能被评估,因为env.ACTION_REF应该始终具有优先权。

特别是,该操作在许多流行配置中不易受攻击,例如:

  • 使用pull_request事件调用操作
  • 使用release事件调用操作
  • 使用push: tags事件调用操作

潜在风险

只有在特定条件下,攻击者才能利用此漏洞:

  1. 攻击者能够控制分支或标签名称
  2. env.ACTION_REFenv.PR_REF都为空值
  3. 工作流配置使得攻击者控制的值能够传递到漏洞代码中

CVSS评分

  • CVSS总体评分:0.0/10(低危)
  • CVSS v3基础指标:AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:N
  • 弱点分类:CWE-77(命令中使用的特殊元素的不当中和,即命令注入)

解决方案

修复版本

已发布修复版本1.13.0,用户应升级到此版本或更高版本。

临时缓解措施

如果无法立即升级,可以考虑以下缓解措施:

  1. 避免在可能受攻击者控制的上下文中使用此操作
  2. 审查工作流配置,确保不会将不受信任的输入传递给该操作
  3. 监控分支和标签名称的创建,防止恶意命名的分支/标签

开发者建议

  1. 在使用GitHub Actions表达式时,应注意其与普通shell插值的区别
  2. 避免在可能包含用户输入的上下文中使用${{ ... }}表达式
  3. 对于需要处理潜在不受信任输入的场景,应考虑使用适当的输入验证和清理

相关资源

总结

PyPI发布GitHub Actions中的这个表达式注入漏洞虽然技术评分较低,但它揭示了GitHub Actions工作流中一个重要的安全问题。开发者在设计自动化工作流时,需要特别注意如何处理可能受攻击者控制的输入,尤其是在使用表达式扩展和shell命令时。及时更新到修复版本1.13.0是保护工作流安全的关键步骤。

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