
Paquete e imagen reforzados de dasel v3.3.1 construidos mediante Melange y apko. Parcheando CVE-2026-33320.
Este es un paquete melange y una imagen de contenedor apko para dasel v3.3.1 con un parche en tiempo de compilación para CVE-2026-33320 (expansión ilimitada de alias YAML). La imagen se construye enteramente a partir de un APK producido localmente; no se utiliza ninguna imagen upstream preconstruida.
| Herramienta | Versión probada | Propósito |
|---|---|---|
| Docker | 29.3.1 | Runtime de contenedores; ejecuta melange/apko mediante compose.yaml |
| melange | 0.50.5 (imagen Docker cgr.dev/chainguard/melange@sha256:b6f11bb45a6090c182986028fd2249fb1a18dcb6e173c4ce001dd3fb4cb1dd71) | Constructor de paquetes APK |
| apko | 1.2.10 (imagen Docker cgr.dev/chainguard/apko@sha256:20dfc1f5e3461b5eaf3279f762cd4bf86c7f3635d2a9642f905cf583525f9ee6) | Constructor de imágenes OCI |
Todos los comandos de compilación y carga funcionan desde cualquier terminal (PowerShell, CMD o bash). Un paso todavía requiere un shell Unix:
bash tests/test.sh — el script de pruebas usa bash y coreutils (timeout, grep, sed)Instale Git Bash (se incluye con Git for Windows) antes de ejecutar las pruebas de la imagen.
.
├── .github/
├── melange/
│ ├── dasel.yaml
│ └── CVE-2026-33320.patch
├── apko/
│ └── dasel.yaml
├── tests/
│ └── test.sh
├── Makefile
├── compose.yaml
├── keys/ # Generated, gitignored
│ ├── melange.rsa
│ └── melange.rsa.pub
├── sbom/ # Generated, gitignored
│ ├── sbom-x86_64.spdx.json
│ └── sbom-index.spdx.json
├── packages/ # Generated, gitignored
│ └── x86_64/
│ ├── dasel-3.3.1-r0.apk
│ └── APKINDEX.tar.gz
└── README.md
make build # keygen (if needed) + package + image
make test # package tests + image tests
make all # build + test
make clean # remove all generated artifacts
make help # list all targets and variables
# 1. Generate signing keys (one-time)
docker compose run --rm melange keygen keys/melange.rsa
# 2. Build the APK package (fetches source, applies CVE patch, compiles)
docker compose run --rm melange build melange/dasel.yaml --arch x86_64 --signing-key keys/melange.rsa
# 3. Build the OCI image (consumes the local APK)
docker compose run --rm apko build apko/dasel.yaml dasel:3.3.1 dasel.tar --arch x86_64 --sbom-path sbom/
El paso 2 genera y firma automáticamente packages/x86_64/APKINDEX.tar.gz.
Después de cargar la imagen, ejecute dasel:
docker load --input dasel.tar
# Example: query a JSON file
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'
Estas opciones aplican la capa de tiempo de ejecución de la estrategia de defensa en profundidad descrita en Endurecimiento de la imagen: un sistema de archivos raíz inmutable, cero capacidades de Linux y ninguna vía de escalada de privilegios.
make test # all tests (package + image)
make package-test # melange package tests only
make image-test # image tests only (requires bash)
# Package tests
docker compose run --rm melange test melange/dasel.yaml --arch x86_64
# Image tests (requires Git Bash on Windows)
docker load --input dasel.tar
bash tests/test.sh
El script de pruebas verifica:
dasel version reporta v3.3.1-i json 'test')-i json -o yaml --root)"yaml expansion budget exceeded" en lugar de colgarseLa vulnerabilidad permite un consumo ilimitado de CPU/memoria mediante alias YAML anidados exponencialmente (ataque billion laughs). El parche en melange/CVE-2026-33320.patch añade dos salvaguardas al lector YAML de dasel: un límite de profundidad de expansión (32) que limita el anidamiento recursivo de alias, y un presupuesto de expansión (1000) que limita el total de desreferencias de alias por documento. Cuando se alcanza cualquiera de los límites, la decodificación devuelve un error de inmediato.
-trimpath para eliminar las rutas de compilación localesLa imagen aplica defensa en profundidad más allá del empaquetado mínimo:
La imagen construida (dasel.tar) se escaneó con herramientas estándar de la industria para validar la postura de seguridad más allá del propio parche de CVE.
Syft extrajo 36 paquetes de la imagen inspeccionando los metadatos de módulos del binario Go:
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 y 25 más/usr/bin/dasel, /etc/ssl/certs/ca-certificates.crt, base de datos APK, SBOM por paquete y archivos de configuración de baselayoutEl SBOM que generé fue inspeccionado con Grype y no se encontraron otras vulnerabilidades en ninguno de los 32 módulos Go ni en los 3 paquetes APK.
--arch adicionalesbusybox, go, ca-certificates-bundle). Si se descubre una vulnerabilidad en cualquiera de esos paquetes upstream, también afectaría a esta imagen. Mantener los paquetes Wolfi actualizados o suscribirse a sus avisos de seguridad sería necesario en produccióncompose.yaml. Esto se desarrolló en Kali 2025.3 y se verificó en Windows 10 con Docker Desktop 29.3.1tests/test.sh usa timeout (coreutils) y la CLI de Docker. Todos los demás comandos son docker puros y funcionan desde PowerShell o CMD. En Windows, ejecute el script de pruebas desde Git Bash (consulte Requisitos de Windows)apko genera automáticamente SBOM SPDX en tiempo de compilación en la carpeta sbom/ (sbom/sbom-x86_64.spdx.json, sbom/sbom-index.spdx.json). Estos registran los 3 paquetes APK instalados con versiones, CPE, procedencia de las fuentes y referencias a las definiciones de compilación de Melange. Sin embargo, no incluyen las dependencias de módulos Go compiladas en el binario dasel. Decidí escanearlos y usé Syft para cerrar esta brecha extrayendo los 32 módulos Go de los metadatos integrados del binario.
Para un entorno de producción debería existir cierta automatización de la extracción del SBOM que consulte periódicamente. Luego tal vez adjuntar los resultados del SBOM con algo como https://github.com/nedlir/CVEnotifier, que escribí en Golang para encontrar vulnerabilidades novedosas en la cadena de suministro.
Compilaciones multiarquitectura - soportar múltiples arquitecturas para compilar este contenedor.
Pipeline de CI/CD - automatizar la compilación y las pruebas en GitHub Actions con acciones de contenedor para melange/apko
SBOM a nivel de Go en melange - ejecutar syft durante el pipeline de compilación de melange e incrustar el SBOM de módulos Go junto al APK
| Capa | Medida | Efecto |
|---|
| Construcción | Usuario no root (UID 65532) | El proceso del contenedor nunca se ejecuta como root |
| Construcción | -s -w ldflags + -trimpath automático | Binario sin símbolos, sin fugas de rutas locales |
| Construcción | Solo 3 paquetes | Superficie de ataque mínima, sin shell ni gestor de paquetes |
| Tiempo de ejecución | --read-only | Sistema de archivos raíz inmutable |
| Tiempo de ejecución | --cap-drop=ALL | Cero capacidades de Linux |
| Tiempo de ejecución | --no-new-privileges | Evita la escalada de privilegios mediante setuid/setgid |
| Comando | Resultado |
|---|
docker compose run --rm melange keygen keys/melange.rsa | Correcto |
docker compose run --rm melange build melange/dasel.yaml --arch x86_64 --signing-key keys/melange.rsa | Correcto: parche aplicado (7/7 hunks), APK generado |
docker compose run --rm melange test melange/dasel.yaml --arch x86_64 | Correcto: versión, extracción de claves JSON, acceso a arreglos JSON |
docker compose run --rm apko build apko/dasel.yaml dasel:3.3.1 dasel.tar --arch x86_64 --sbom-path sbom/ | Correcto: 3 paquetes instalados, tarball OCI generado |
docker load --input dasel.tar | Correcto: dasel:3.3.1-amd64 cargado |
bash tests/test.sh | Correcto: todas las pruebas (versión, extracción de claves, conversión de formato, alias YAML, parche CVE) |
docker run --rm -v ... anchore/grype:latest /work/dasel.tar | Correcto: 1 hallazgo (falso positivo esperado para el CVE parcheado) |
docker run --rm -v ... anchore/syft:latest /work/dasel.tar | Correcto: 36 paquetes catalogados (3 APK + 32 Go + 1 stdlib) |