
Paquet et image dasel v3.3.1 durcis construits via Melange et apko. Correction de CVE-2026-33320.
Ceci est un package melange et une image de conteneur apko pour dasel v3.3.1 avec un correctif au moment de la construction pour CVE-2026-33320 (expansion d'alias YAML sans limite). L'image est entièrement construite à partir d'un APK produit localement – aucune image amont préconstruite n'est utilisée.
| Outil | Version testée | Objectif |
|---|---|---|
| Docker | 29.3.1 | Runtime de conteneur, exécute melange/apko via compose.yaml |
| melange | 0.50.5 (image Docker cgr.dev/chainguard/melange@sha256:b6f11bb45a6090c182986028fd2249fb1a18dcb6e173c4ce001dd3fb4cb1dd71) | Constructeur de packages APK |
| apko | 1.2.10 (image Docker cgr.dev/chainguard/apko@sha256:20dfc1f5e3461b5eaf3279f762cd4bf86c7f3635d2a9642f905cf583525f9ee6) | Constructeur d'images OCI |
Toutes les commandes de construction et de chargement fonctionnent depuis n'importe quel terminal (PowerShell, CMD ou bash). Une étape nécessite encore un shell Unix :
bash tests/test.sh — le script de test utilise bash et coreutils (timeout, grep, sed)Installez Git Bash (fourni avec Git for Windows) avant d'exécuter les tests de l'image.
.
├── .github/
├── melange/
│ ├── dasel.yaml
│ └── CVE-2026-33320.patch
├── apko/
│ └── dasel.yaml
├── tests/
│ └── test.sh
├── Makefile
├── compose.yaml
├── keys/ # Généré, gitignoré
│ ├── melange.rsa
│ └── melange.rsa.pub
├── sbom/ # Généré, gitignoré
│ ├── sbom-x86_64.spdx.json
│ └── sbom-index.spdx.json
├── packages/ # Généré, gitignoré
│ └── x86_64/
│ ├── dasel-3.3.1-r0.apk
│ └── APKINDEX.tar.gz
└── README.md
make build # keygen (si nécessaire) + package + image
make test # tests du package + tests de l'image
make all # construction + test
make clean # supprime tous les artefacts générés
make help # liste toutes les cibles et variables
# 1. Générer les clés de signature (unique)
docker compose run --rm melange keygen keys/melange.rsa
# 2. Construire le package APK (télécharge la source, applique le correctif CVE, compile)
docker compose run --rm melange build melange/dasel.yaml --arch x86_64 --signing-key keys/melange.rsa
# 3. Construire l'image OCI (consomme l'APK local)
docker compose run --rm apko build apko/dasel.yaml dasel:3.3.1 dasel.tar --arch x86_64 --sbom-path sbom/
L'étape 2 génère et signe automatiquement packages/x86_64/APKINDEX.tar.gz.
Après avoir chargé l'image, exécutez dasel :
docker load --input dasel.tar
# Exemple : interroger un fichier 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'
Ces drapeaux imposent la couche d'exécution de la stratégie de défense en profondeur décrite dans Durcissement de l'image : un système de fichiers racine immuable, zéro capacité Linux et aucune voie d'escalade de privilèges.
make test # tous les tests (package + image)
make package-test # tests du package melange uniquement
make image-test # tests de l'image uniquement (nécessite bash)
# Tests du package
docker compose run --rm melange test melange/dasel.yaml --arch x86_64
# Tests de l'image (nécessite Git Bash sur Windows)
docker load --input dasel.tar
bash tests/test.sh
Le script de test vérifie :
dasel version rapporte v3.3.1-i json 'test')-i json -o yaml --root)"yaml expansion budget exceeded" au lieu de bloquerLa vulnérabilité permet une consommation illimitée de CPU/mémoire via des alias YAML imbriqués de manière exponentielle (attaque billion laughs). Le correctif dans melange/CVE-2026-33320.patch ajoute deux garde-fous au lecteur YAML de dasel : une limite de profondeur d'expansion (32) qui limite l'imbrication récursive des alias, et un budget d'expansion (1000) qui limite le nombre total de déréférencements d'alias par document. Lorsque l'une ou l'autre limite est atteinte, le décodage retourne immédiatement une erreur.
-trimpath pour supprimer les chemins de construction locauxL'image applique une défense en profondeur au-delà de l'empaquetage minimal :
L'image construite (dasel.tar) a été scannée avec des outils standard de l'industrie pour valider la posture de sécurité au-delà du correctif CVE lui-même.
Syft a extrait 36 packages de l'image en inspectant les métadonnées des modules Go du binaire :
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, et 25 autres/usr/bin/dasel, /etc/ssl/certs/ca-certificates.crt, base de données APK, SBOM par package et fichiers de configuration baselayoutLe SBOM que j'ai généré a été inspecté avec Grype, et aucune autre vulnérabilité n'a été trouvée parmi les 32 modules Go ou les 3 packages APK.
--arch supplémentairesbusybox, go, ca-certificates-bundle). Si une vulnérabilité est découverte dans l'un de ces packages amont, elle affecterait cette image également. Maintenir les packages Wolfi à jour ou s'abonner à leurs avis de sécurité serait nécessaire en productioncompose.yaml. Ceci a été développé sur Kali 2025.3 et vérifié sur Windows 10 avec Docker Desktop 29.3.1tests/test.sh utilise timeout (coreutils) et l'interface CLI Docker. Toutes les autres commandes sont du docker pur et fonctionnent depuis PowerShell ou CMD. Sous Windows, exécutez le script de test depuis Git Bash (voir Prérequis Windows)apko génère automatiquement des SBOM SPDX au moment de la construction dans le dossier sbom/ (sbom/sbom-x86_64.spdx.json, sbom/sbom-index.spdx.json). Ceux-ci suivent les 3 packages APK installés avec leurs versions, CPE, provenance des sources et références aux définitions de construction Melange. Cependant, ils n'incluent pas les dépendances de modules Go compilées dans le binaire dasel. J'ai décidé de les scanner et j'ai utilisé Syft pour combler cette lacune en extrayant les 32 modules Go des métadonnées intégrées du binaire.
Pour un environnement de production, il faudrait une certaine automatisation de l'extraction du SBOM qui interrogerait périodiquement. Ensuite, peut-être attacher les résultats du SBOM avec quelque chose comme https://github.com/nedlir/CVEnotifier que j'ai écrit en Golang pour trouver de nouvelles vulnérabilités dans la chaîne d'approvisionnement.
Constructions multi-architecture – prendre en charge plusieurs architectures pour la construction de ce conteneur.
Pipeline CI/CD – automatiser la construction + test dans GitHub Actions avec les actions de conteneur melange/apko
SBOM au niveau Go dans melange – exécuter syft pendant le pipeline de construction melange et intégrer le SBOM des modules Go à côté de l'APK
| Couche | Mesure | Effet |
|---|
| Build | Utilisateur non-root (UID 65532) | Le processus du conteneur ne s'exécute jamais en root |
| Build | ldflags -s -w + auto -trimpath | Binaire allégé, aucune fuite de chemin local |
| Build | Seulement 3 packages | Surface d'attaque minimale, pas de shell ni gestionnaire de packages |
| Runtime | --read-only | Système de fichiers racine immuable |
| Runtime | --cap-drop=ALL | Zéro capacité Linux |
| Runtime | --no-new-privileges | Empêche l'escalade de privilèges via setuid/setgid |
| Commande | Résultat |
|---|
docker compose run --rm melange keygen keys/melange.rsa | Réussi |
docker compose run --rm melange build melange/dasel.yaml --arch x86_64 --signing-key keys/melange.rsa | Réussi – correctif appliqué (7/7 segments), APK produit |
docker compose run --rm melange test melange/dasel.yaml --arch x86_64 | Réussi – version, extraction de clé JSON, accès tableau JSON |
docker compose run --rm apko build apko/dasel.yaml dasel:3.3.1 dasel.tar --arch x86_64 --sbom-path sbom/ | Réussi – 3 packages installés, archive OCI produite |
docker load --input dasel.tar | Réussi – dasel:3.3.1-amd64 chargé |
bash tests/test.sh | Réussi – tous les tests (version, extraction de clé, conversion de format, alias YAML, correctif CVE) |
docker run --rm -v ... anchore/grype:latest /work/dasel.tar | Réussi – 1 découverte (faux positif attendu pour la CVE corrigée) |
docker run --rm -v ... anchore/syft:latest /work/dasel.tar | Réussi – 36 packages catalogués (3 APK + 32 Go + 1 stdlib) |