PyPI发布GitHub Action存在表达式注入漏洞,可能导致命令执行

文章详细披露了PyPI官方发布的GitHub Action "gh-action-pypi-publish"中的一个低危安全漏洞。该漏洞源于在动作步骤中不当使用了可被攻击者控制的表达式扩展(${{ ... }}),在特定触发条件下可能允许攻击者在执行工作流的步骤中运行任意代码。

漏洞详情

: actions / pypa/gh-action-pypi-publish (GitHub Actions)

受影响版本: < 1.13.0

已修复版本: 1.13.0

描述

概述 gh-action-pypi-publish 在可能被攻击者控制的上下文中使用了 GitHub Actions 表达式扩展(即 ${{ ... }})。根据调用 gh-action-pypi-publish 所使用的触发器,这可能允许攻击者在调用 gh-action-pypi-publish 的工作流步骤上下文中执行任意代码。

详情 gh-action-pypi-publish 包含一个复合动作步骤 set-repo-and-ref,该步骤使用了表达式扩展:

 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 }}

永久链接: https://github.com/pypa/gh-action-pypi-publish/blob/db8f07d3871a0a180efa06b95d467625c19d5d5f/action.yml#L114-L125

在正常的预期操作中,这些扩展用于为 refrepo-id 等输出建立正确的优先级。

然而,这些扩展有一个副作用:因为它们是使用 ${{ ... }} 完成的,而不是使用 ${...}(即普通的 shell 插值),所以它们可以绕过普通的 shell 引用规则。特别是,如果 env.ACTION_REFenv.PR_REF 都评估为空字符串,那么表达式将回退到 github.ref_name,而 github.ref_name 可以通过分支或标签名被攻击者控制。

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

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

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

关于危险扩展的更多信息可以在 zizmor 的模板注入规则文档中找到。

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

具体来说,在许多流行配置中(即使用 pull_requestreleasepush: tags 事件来调用此动作的配置中),该动作不易受攻击。

参考

  • GHSA-vxmw-7h4f-hqxh
  • pypa/gh-action-pypi-publish@77db1b7

其他信息

严重程度: 低

CVSS v3 基础指标:

  • 攻击向量: 网络
  • 攻击复杂度: 低
  • 所需权限: 无
  • 用户交互: 无
  • 范围: 未改变
  • 机密性影响: 无
  • 完整性影响: 无
  • 可用性影响: 无

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:N

弱点:

  • CWE-77: 对命令中使用的特殊元素进行不当中和(命令注入)

GHSA ID: GHSA-vxmw-7h4f-hqxh

源代码: pypa/gh-action-pypi-publish

报告者: woodruffw

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