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, 容器镜像, 打包构建, 日志审计, 漏洞补丁, 请求拦截