使用 Melange 打包 dasel v3.3.1,用 apko 构建容器镜像,并修复 CVE-2026-33320。
前置条件: Docker。所有构建步骤在容器内运行 — 无需本地安装 melange/apko。所有命令在 linux/amd64(或支持 linux/amd64 模拟的 Docker Desktop)上从仓库根目录执行。
第 0 步 — 生成签名密钥(一次性)
docker run --rm -v "/${PWD}":/work cgr.dev/chainguard/melange keygen
第 1 步 — 构建包
docker run --privileged --rm -v "/${PWD}":/work cgr.dev/chainguard/melange build melange/dasel.yaml --arch amd64 --signing-key melange.rsa
输出:packages/x86_64/dasel-3.3.1-r1.apk
第 2 步 — 测试包
docker run --privileged --rm -v "/${PWD}":/work cgr.dev/chainguard/melange test melange/dasel.yaml --arch amd64 --repository-append //work/packages --keyring-append //work/melange.rsa.pub
第 3 步 — 构建镜像
docker run --rm -v "/${PWD}":/work cgr.dev/chainguard/apko build apko/dasel.yaml dasel-image:latest dasel-image.tar --arch amd64 -k melange.rsa.pub
输出:dasel-image.tar。apko/dasel.yaml 中的 @local ./packages 仓库使 apko 安装你在第 1 步构建的 APK。-k 让 apko 信任 Melange 签名密钥。apko 会在标签后追加架构,因此加载的镜像为 dasel-image:latest-amd64。
第 4 步 — 加载镜像
docker load --input dasel-image.tar
第 5 步 — 运行镜像测试
bash tests/test.sh
十项测试:二进制文件存在且可运行、JSON 扁平键查询、架构为 amd64、CVE 预算限制拒绝 YAML 别名炸弹、正常 YAML 绿色路径读取、嵌套 JSON 路径、数组索引访问、TOML 格式、CVE 深度限制拒绝 33 层别名链、格式错误的 JSON 被拒绝。
melange/CVE-2026-33320.patch 在 parsing/yaml/yaml_reader.go 中添加了两项保护:
maxExpansionDepth = 32 — 拒绝超过 32 层深的别名链maxExpansionBudget = 100 — 拒绝总别名解析次数超过 100 次的文档两者均以非零退出码退出,并输出包含 yaml expansion 的消息。tests/test.sh 中的测试 4 验证了这一点。
运行命令顺序:melange keygen → melange build → melange test → apko build → docker load → tests/test.sh
所有步骤在 linux/amd64 上通过。
如果有更多时间我会改进的地方:
test.sh 中将镜像标签和 tarball 名称参数化