1. GitHub Actions工件下载机制解析
GitHub Actions作为CI/CD流程的核心组件,其工件(Artifacts)功能允许工作流运行期间生成的文件被保留和共享。典型场景包括:
- 构建产物(如二进制文件、Docker镜像)
- 测试报告(JUnit格式、覆盖率结果)
- 临时日志文件
工件通过upload-artifact和download-artifact这对Action实现传输。当开发者执行下载操作时,后端服务会将压缩的工件包解压到Runner的工作目录。这个看似简单的过程,实际上涉及以下关键路径处理逻辑:
yaml复制# 典型下载步骤示例
- uses: actions/download-artifact@v3
with:
name: my-artifact
path: custom/destination
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 路径遍历漏洞的技术原理
2.1 传统路径遍历漏洞模式
传统Web应用中的路径遍历通常发生在未正确过滤用户输入的../序列时。攻击者通过构造类似../../etc/passwd的路径,突破预定目录边界访问系统文件。
2.2 GitHub Actions的特殊性
在CI/CD环境中,路径遍历的影响更为严重:
- 环境特权:Runner通常具有较高的执行权限
- 持久化影响:写入的文件可能影响后续Job或触发其他工作流
- 隐蔽性强:恶意行为可隐藏在正常构建流程中
漏洞触发需要同时满足:
- 工件压缩包内包含精心构造的路径
- 下载解压时未进行路径规范化检查
- 目标Runner具有目标位置的写入权限
3. 漏洞复现与影响验证
3.1 构造恶意工件
使用tar命令创建包含特殊路径的测试工件:
bash复制# 创建测试目录结构
mkdir -p 'malicious-artifact/../../tmp/exploit'
echo "compromised" > 'malicious-artifact/../../tmp/exploit/poc.txt'
# 打包为工件
tar czf artifact.tar.gz -C malicious-artifact .
3.2 上传与下载流程
通过GitHub API上传恶意工件:
python复制import requests
headers = {
"Authorization": f"token {GITHUB_TOKEN}",
"Accept": "application/vnd.github.v3+json"
}
with open('artifact.tar.gz', 'rb') as f:
response = requests.post(
f"https://api.github.com/repos/{owner}/{repo}/actions/artifacts",
headers=headers,
data=f
)
3.3 影响范围评估
成功利用后可实现:
- 覆盖关键系统文件(如
/etc/crontab) - 植入持久化后门(SSH authorized_keys)
- 窃取敏感信息(环境变量、密钥文件)
4. 防御方案与最佳实践
4.1 官方补丁分析
GitHub在2023年Q4发布的更新中:
- 实现了解压时的路径规范化检查
- 限制了工件内文件的绝对路径引用
- 添加了运行时的路径越界检测
4.2 企业级防护措施
对于无法立即升级的环境:
yaml复制# 安全下载模板
- name: Safe download
uses: actions/download-artifact@v3
with:
name: verified-artifact
path: ${{ github.workspace }}/safe-dir
env:
GITHUB_TOKEN: ${{ secrets.READ_ONLY_TOKEN }}
关键加固点:
- 使用专用工作目录(避免
./) - 限制工件下载权限(Read-only token)
- 启用工作流文件签名验证
4.3 持续监控方案
推荐的安全扫描工具组合:
- 静态分析:CodeQL自定义规则检测可疑路径
- 动态检测:Falco实时监控文件系统越界操作
- 审计日志:ELK收集所有工件操作事件
5. 漏洞挖掘方法论
5.1 黑盒测试技巧
使用模糊测试生成异常路径:
python复制import itertools
path_components = ["..", "~", "/tmp", ""]
for combo in itertools.product(path_components, repeat=4):
test_path = "/".join(combo)
# 生成测试用例...
5.2 白盒审计重点
需要特别关注的代码段:
- 压缩/解压处理逻辑
- 路径拼接函数调用点
- 文件权限设置操作
5.3 企业SRC实战经验
在漏洞奖励计划中,有效报告应包含:
- 完整复现步骤(含时间戳)
- 影响范围评估矩阵
- 修复建议的可行性分析
6. 延伸攻击面分析
6.1 供应链攻击变种
结合依赖混淆攻击:
- 污染公开工件仓库
- 劫持内部私有依赖
- 通过路径遍历实现持久化
6.2 横向移动可能性
在自托管Runner环境中:
- 突破容器隔离
- 访问相邻Job的工作区
- 窃取跨项目敏感数据
6.3 日志注入技术
通过特殊构造的路径名:
- 污染工作流日志
- 干扰安全监控系统
- 实施混淆攻击
关键提示:所有测试必须获得明确授权,企业环境应建立专门的沙箱测试流程。实际渗透测试中,我们发现在下载操作后添加
ls -alR验证步骤能快速发现异常文件位置。
我在实际安全审计中发现,许多团队忽视了工件清理环节。建议在工作流结束时添加强制清理步骤:
yaml复制- name: Secure cleanup
run: |
find ${{ github.workspace }} -type f -exec shred -u {} \;
rm -rf ${{ github.workspace }}/..
if: always()
对于高敏感项目,可以考虑完全禁用工件功能,改用S3等具有精细权限控制的存储服务。最近参与的一个金融项目就采用了临时S3桶+预签名URL的方案,虽然增加了复杂度,但显著降低了攻击面。
