
Übung für Junior-Backend-Kandidaten: Paketierung der dasel-CLI (v3.3.1) mit Melange, Behebung von CVE-2026-33320 und Erstellung eines minimalen Container-Images mit Apko.
Paket dasel v3.3.1 mit Melange, ein Container-Image mit apko bauen und CVE-2026-33320 beheben.
Voraussetzungen: Docker. Alle Build-Schritte laufen in Containern ab — keine lokale Melange-/apko-Installation nötig. Führe alle Befehle vom Repository-Root auf linux/amd64 aus (oder Docker Desktop mit linux/amd64-Emulation).
Schritt 0 — Signaturschlüssel erzeugen (einmalig)
docker run --rm -v "/${PWD}":/work cgr.dev/chainguard/melange keygen
Schritt 1 — Das Paket bauen
docker run --privileged --rm -v "/${PWD}":/work cgr.dev/chainguard/melange build melange/dasel.yaml --arch amd64 --signing-key melange.rsa
Ausgabe: packages/x86_64/dasel-3.3.1-r1.apk
Schritt 2 — Das Paket testen
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
Schritt 3 — Das Image bauen
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
Ausgabe: dasel-image.tar. Das @local ./packages-Repository in apko/dasel.yaml sorgt dafür, dass apko das in Schritt 1 gebaute APK installiert. -k erlaubt es apko, den Melange-Signaturschlüssel zu vertrauen. apko hängt die Architektur an den Tag an, daher heißt das geladene Image dasel-image:latest-amd64.
Schritt 4 — Das Image laden
docker load --input dasel-image.tar
Schritt 5 — Image-Tests ausführen
bash tests/test.sh
Zehn Tests: Binärdatei vorhanden und ausführbar, JSON-Flachschlüssel-Abfrage, Architektur ist amd64, CVE-Budget-Limit lehnt eine YAML-Alias-Bombe ab, normaler YAML-Green-Path-Read, verschachtelter JSON-Pfad, Array-Index-Zugriff, TOML-Format, CVE-Tiefenlimit lehnt eine 33-stufige Alias-Kette ab, fehlerhaftes JSON wird abgelehnt.
melange/CVE-2026-33320.patch fügt zwei Schutzmechanismen in parsing/yaml/yaml_reader.go hinzu:
maxExpansionDepth = 32 — lehnt Alias-Ketten ab, die tiefer als 32 Ebenen sindmaxExpansionBudget = 100 — lehnt Dokumente mit mehr als 100 gesamten Alias-Auflösungen abBeide geben einen Exit-Code ungleich Null mit einer Meldung zurück, die yaml expansion enthält. Test 4 in tests/test.sh überprüft dies.
Ausgeführte Befehle: melange keygen → melange build → melange test → apko build → docker load → tests/test.sh
Alle Schritte auf linux/amd64 bestanden.
Was ich mit mehr Zeit verbessern würde:
test.sh parametrisieren.