Omer-Asher/dasel-cve-exercise
GitHub: Omer-Asher/dasel-cve-exercise
该项目演示了使用 Melange 和 apko 将带有 CVE 反向移植补丁的 Dasel 打包为最小化容器镜像的完整流程。
Stars: 0 | Forks: 0
# Dasel v3.3.1 打包练习
## 概述
本项目使用 **Melange** 打包 **Dasel v3.3.1**,并使用 **apko** 构建了一个最小化的运行时容器镜像。
它在保持上游 **v3.3.1** 代码库的基础上,包含了一个针对 **CVE-2026-33320** 的反向移植修复。
最终镜像会安装由 Melange 在本地构建的 APK 包,从而保持运行时镜像小巧且专注于 dasel 二进制文件。
## 交付成果
该解决方案包含:
* 一个针对 **Dasel v3.3.1** 的 Melange 包
* 一个针对 **CVE-2026-33320** 的反向移植补丁,实现了 [GitHub 安全公告](https://github.com/TomWright/dasel/security/advisories/GHSA-4fcp-jxh7-23x8) 中描述的别名展开预算缓解措施
* 一个最小化的 apko 运行时镜像
* 包和运行时测试
## CVE 修复
该缓解措施遵循 [GitHub 安全公告](https://github.com/TomWright/dasel/security/advisories/GHSA-4fcp-jxh7-23x8) 中描述的方法,通过在自定义的 `UnmarshalYAML` 实现中引入别名展开预算来实现。解析器不再允许无限制的递归别名展开,而是跟踪总别名展开次数,并在超过配置的限制后中止解析。
在本练习中,别名展开预算被配置为 **1,000,000** 次递归展开,与安全公告中建议的值相匹配。
**尽管上游在 Dasel v3.3.2 中的修复采用了不同的实现方法,但此处展示的实现演示了一种替代的缓解方案,而不是直接复制上游的实现。**
包含的 `bomb.yaml` 回归测试表明,修复后的版本会安全地拒绝过度的别名展开,并报出以下错误:
```
yaml expansion budget exceeded
```
## 假设
* 包和镜像仅针对 **linux/amd64 (x86_64)**。
* 本解决方案特意在 **Dasel v3.3.1** 的基础上实现为最小化的反向移植,遵循 GitHub 安全公告中描述的缓解措施。
## 构建
构建过程包括:
1. 生成签名密钥。
2. 构建 Melange 包。
3. 从本地生成的 APK 构建最小化的 apko 镜像。
4. 将镜像加载到 Docker 中。
### 1. 生成签名密钥
```
mkdir -p keys && \
docker run --rm \
-v "$(pwd)":/work \
-w /work \
cgr.dev/chainguard/melange \
keygen keys/melange.rsa
```
### 2. 构建 Melange 包
```
docker run --rm --privileged \
-v "$(pwd)":/work \
-w /work \
cgr.dev/chainguard/melange \
build melange/dasel.yaml \
--arch x86_64 \
--signing-key keys/melange.rsa \
--out-dir packages
```
### 3. 构建 apko 镜像
apko 构建会使用由 Melange 生成的本地 APK 包。
```
docker run --rm \
-v "$(pwd)":/work \
-w /work \
cgr.dev/chainguard/apko \
build \
--repository-append /work/packages \
--keyring-append /work/keys/melange.rsa.pub \
apko/dasel.yaml \
dasel:latest \
dasel.tar
```
### 4. 加载镜像
```
docker load < dasel.tar
```
## 运行时测试
运行完整的运行时测试套件:
```
chmod +x tests/test.sh
./tests/test.sh
```
测试脚本会验证:
* 是否存在预期的 `dasel` 二进制文件。
* 镜像是否包含预期的 **v3.3.1** 构建。
* 容器内的真实 YAML 查询是否能正常工作。
* CVE 缓解措施是否成功拒绝了 Billion Laughs payload。
预期输出:
```
Testing version...
✓ Version is v3.3.1
Testing Dasel YAML query...
✓ YAML query works
Testing Billion Laughs mitigation...
✓ Malicious payload rejected
All tests passed.
```
## 未来改进
完成实现后,我查阅了 **Dasel v3.3.2** 中引入的官方上游修复。上游实现通过将别名展开预算与最大别名展开深度相结合,扩展了该缓解措施。
如果有更多时间,我会评估采用类似的深度限制作为额外的防御层,并比较不同的实现方法(例如通过专用的 context 对象传递解析状态,或像上游实现那样将展开状态嵌入到 `yamlValue` 中),以确定哪种方法在可读性、可维护性以及对现有 **v3.3.1** 代码库的最小修改之间提供最佳的平衡。
标签:Chainguard, Cutter, 容器镜像, 打包构建, 日志审计, 漏洞补丁, 请求拦截