
Melangeとapkoでビルドされた強化版dasel v3.3.1パッケージとイメージ。CVE-2026-33320のパッチ適用。
これは、dasel v3.3.1 のビルド時に CVE-2026-33320(YAML エイリアスの無制限展開)のパッチを適用した melange パッケージおよび apko コンテナイメージです。イメージはすべてローカルで生成された APK から構築されており、事前にビルドされた上流イメージは使用していません。
| ツール | テスト済みバージョン | 目的 |
|---|---|---|
| Docker | 29.3.1 | コンテナランタイム、compose.yaml 経由で melange/apko を実行 |
| melange | 0.50.5(Docker イメージ cgr.dev/chainguard/melange@sha256:b6f11bb45a6090c182986028fd2249fb1a18dcb6e173c4ce001dd3fb4cb1dd71) | APK パッケージビルダー |
| apko | 1.2.10(Docker イメージ cgr.dev/chainguard/apko@sha256:20dfc1f5e3461b5eaf3279f762cd4bf86c7f3635d2a9642f905cf583525f9ee6) | OCI イメージビルダー |
すべてのビルドおよびロードコマンドは任意のターミナル(PowerShell、CMD、bash)から実行できます。ただし、1つのステップでは Unix シェルが必要です。
bash tests/test.sh — テストスクリプトは bash と coreutils(timeout、grep、sed)を使用します。イメージテストを実行する前に、Git Bash(Git for Windows に付属)をインストールしてください。
.
├── .github/
├── melange/
│ ├── dasel.yaml
│ └── CVE-2026-33320.patch
├── apko/
│ └── dasel.yaml
├── tests/
│ └── test.sh
├── Makefile
├── compose.yaml
├── keys/ # 生成ファイル、gitignore 対象
│ ├── melange.rsa
│ └── melange.rsa.pub
├── sbom/ # 生成ファイル、gitignore 対象
│ ├── sbom-x86_64.spdx.json
│ └── sbom-index.spdx.json
├── packages/ # 生成ファイル、gitignore 対象
│ └── x86_64/
│ ├── dasel-3.3.1-r0.apk
│ └── APKINDEX.tar.gz
└── README.md
make build # keygen(必要な場合)+ パッケージ + イメージ
make test # パッケージテスト + イメージテスト
make all # ビルド + テスト
make clean # 生成されたアーティファクトをすべて削除
make help # すべてのターゲットと変数を表示
# 1. 署名鍵の生成(一度だけ)
docker compose run --rm melange keygen keys/melange.rsa
# 2. APK パッケージのビルド(ソースを取得、CVE パッチ適用、コンパイル)
docker compose run --rm melange build melange/dasel.yaml --arch x86_64 --signing-key keys/melange.rsa
# 3. OCI イメージのビルド(ローカル APK を使用)
docker compose run --rm apko build apko/dasel.yaml dasel:3.3.1 dasel.tar --arch x86_64 --sbom-path sbom/
ステップ2では自動的に packages/x86_64/APKINDEX.tar.gz が生成され署名されます。
イメージをロードしたら、dasel を実行:
docker load --input dasel.tar
# 例: JSON ファイルのクエリ
echo '{"name": "dasel"}' | docker run --rm \
--read-only \
--cap-drop=ALL \
--security-opt=no-new-privileges \
-i dasel:3.3.1-amd64 \
-i json 'name'
これらのフラグは、イメージの強化 で説明した多層防御戦略のランタイム層を適用します。不変のルートファイルシステム、ゼロの Linux ケーパビリティ、権限昇格パスなし。
make test # 全テスト(パッケージ + イメージ)
make package-test # melange パッケージテストのみ
make image-test # イメージテストのみ(bash が必要)
# パッケージテスト
docker compose run --rm melange test melange/dasel.yaml --arch x86_64
# イメージテスト(Windows では Git Bash が必要)
docker load --input dasel.tar
bash tests/test.sh
テストスクリプトは以下を検証します:
dasel version が v3.3.1 を報告すること-i json 'test')-i json -o yaml --root)"yaml expansion budget exceeded" エラーが発生し、ハングしないことこの脆弱性は、指数関数的にネストされた YAML エイリアス(billion laughs 攻撃)による無制限の CPU/メモリ消費を許容します。melange/CVE-2026-33320.patch のパッチでは、dasel の YAML リーダーに2つの保護策を追加しています。再帰的なエイリアスのネストを制限する展開深度制限(32)と、ドキュメントあたりのエイリアス展開総数を制限する展開予算(1000)です。どちらかの制限に達すると、デコードが即座にエラーを返します。
-trimpath でビルドされ、ローカルビルドパスを除去イメージは最小限のパッケージ化に加えて、多層防御を適用しています:
ビルドされたイメージ(dasel.tar)は、CVE パッチ自体に加えてセキュリティ態勢を検証するために、業界標準のツールでスキャンされました。
Syft は Go バイナリのモジュールメタデータを検査して、イメージから 36 パッケージ を抽出しました:
wolfi-baselayout 20230201-r29、ca-certificates-bundle 20260413-r0、dasel 3.3.1-r0go.yaml.in/yaml/v4、github.com/hashicorp/hcl/v2、github.com/pelletier/go-toml/v2、github.com/goccy/go-json、github.com/charmbracelet/bubbletea、golang.org/x/sys、golang.org/x/text、stdlib go1.25.9、およびさらに 25 個/usr/bin/dasel、/etc/ssl/certs/ca-certificates.crt、APK DB、パッケージごとの SBOM、baselayout 設定ファイル生成した SBOM を Grype で検査したところ、32 の Go モジュールと 3 の APK パッケージのいずれにも脆弱性は見つかりませんでした。
--arch フラグが必要busybox、go、ca-certificates-bundle)に依存しています。これらの上流パッケージのいずれかに脆弱性が発見された場合、このイメージも影響を受けます。本番環境では Wolfi パッケージを最新に保つか、セキュリティアドバイザリに登録することが必要compose.yaml 経由で Docker コンテナとして実行されます。これは Kali 2025.3 で開発され、Docker Desktop 29.3.1 を使用して Windows 10 で検証済みtests/test.sh は timeout(coreutils)と Docker CLI を使用します。他のすべてのコマンドは純粋な docker であり、PowerShell または CMD から動作します。Windows では Git Bash からテストスクリプトを実行してください(Windows の要件 を参照)apko はビルド時に自動的に SPDX SBOM を sbom/ フォルダに生成します(sbom/sbom-x86_64.spdx.json、sbom/sbom-index.spdx.json)。これらは、インストールされた3つの APK パッケージをバージョン、CPE、ソースの来歴、Melange ビルド定義の参照とともに追跡します。ただし、dasel バイナリにコンパイルされた Go モジュールの依存関係は含まれていません。私はそれらをスキャンすることを決め、Syft を使用してバイナリの埋め込みメタデータからすべての32の Go モジュールを抽出することでこのギャップを埋めました。
本番環境では、SBOM 抽出を自動化し、定期的にポーリングする必要があります。そして、SBOM 結果を、サプライチェーン内の新たな脆弱性を見つけるために私が Golang で書いた https://github.com/nedlir/CVEnotifier のようなものに添付するかもしれません。
マルチアーキテクチャビルド - このコンテナの複数アーキテクチャ対応をサポート
CI/CD パイプライン - GitHub Actions で melange/apko コンテナアクションを使用してビルド+テストを自動化
melange での Go レベル SBOM - melange ビルドパイプライン中に syft を実行し、Go モジュールの SBOM を APK と一緒に埋め込む
| 層 | 対策 | 効果 |
|---|
| ビルド | 非rootユーザー(UID 65532) | コンテナプロセスが root で実行されることはない |
| ビルド | -s -w ldflags + auto -trimpath | バイナリのストリップ、ローカルパス漏洩なし |
| ビルド | 3 パッケージのみ | 攻撃対象領域を最小化、シェルやパッケージマネージャなし |
| ランタイム | --read-only | 不変のルートファイルシステム |
| ランタイム | --cap-drop=ALL | ゼロの Linux ケーパビリティ |
| ランタイム | --no-new-privileges | setuid/setgid による権限昇格を防止 |
| コマンド | 結果 |
|---|
docker compose run --rm melange keygen keys/melange.rsa | 成功 |
docker compose run --rm melange build melange/dasel.yaml --arch x86_64 --signing-key keys/melange.rsa | 成功 - パッチ適用(7/7 hunks)、APK 生成 |
docker compose run --rm melange test melange/dasel.yaml --arch x86_64 | 成功 - バージョン、JSON キー抽出、JSON 配列アクセス |
docker compose run --rm apko build apko/dasel.yaml dasel:3.3.1 dasel.tar --arch x86_64 --sbom-path sbom/ | 成功 - 3 パッケージインストール、OCI tarball 生成 |
docker load --input dasel.tar | 成功 - dasel:3.3.1-amd64 ロード |
bash tests/test.sh | 成功 - 全テスト(バージョン、キー抽出、形式変換、YAML エイリアス、CVE パッチ) |
docker run --rm -v ... anchore/grype:latest /work/dasel.tar | 成功 - 1件の検出(パッチ適用済み CVE の予想された誤検出) |
docker run --rm -v ... anchore/syft:latest /work/dasel.tar | 成功 - 36 パッケージカタログ化(APK:3、Go:32、stdlib:1) |