
Junior Backend Candidate Exercise: Packaging the dasel CLI (v3.3.1) with Melange, fixing CVE-2026-33320, and building a minimal container image using Apko.
Melange でパッケージ dasel v3.3.1 を構築し、apko でコンテナイメージを作成し、CVE-2026-33320 を修正します。
前提条件: Docker。すべてのビルド手順はコンテナ内で実行されます — ローカルの melange/apko インストールは不要です。すべてのコマンドは linux/amd64(または Docker Desktop で linux/amd64 エミュレーションを使用)のリポジトリルートから実行してください。
ステップ 0 — 署名鍵の生成(1回のみ)
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
10のテスト: バイナリが存在し実行可能、JSON平坦キークエリ、アーキテクチャがamd64、CVE予算制限がYAMLエイリアス爆弾を拒否、通常のYAML正常系読み取り、ネストされたJSONパス、配列インデックスアクセス、TOML形式、CVE深さ制限が33レベルのエイリアスチェーンを拒否、不正なJSONを拒否。
melange/CVE-2026-33320.patch は parsing/yaml/yaml_reader.go に2つのガードを追加します:
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名をパラメータ化する