
Pacote e imagem Endurecido dasel v3.3.1 construídos via Melange e apko. Corrigindo CVE-2026-33320.
Este é um pacote melange e uma imagem de contentor apko para dasel v3.3.1 com uma correção em tempo de compilação para CVE-2026-33320 (expansão ilimitada de aliases YAML). A imagem é construída inteiramente a partir de um APK produzido localmente - nenhuma imagem pré-construída de upstream é usada.
| Ferramenta | Versão testada | Finalidade |
|---|
| Docker | 29.3.1 | Runtime de contentor, executa melange/apko via compose.yaml |
| melange | 0.50.5 (imagem Docker cgr.dev/chainguard/melange@sha256:b6f11bb45a6090c182986028fd2249fb1a18dcb6e173c4ce001dd3fb4cb1dd71) | Construtor de pacotes APK |
| apko | 1.2.10 (imagem Docker cgr.dev/chainguard/apko@sha256:20dfc1f5e3461b5eaf3279f762cd4bf86c7f3635d2a9642f905cf583525f9ee6) | Construtor de imagens OCI |
Todos os comandos de compilação e carregamento funcionam em qualquer terminal (PowerShell, CMD ou bash). Ainda é necessário um shell Unix para um passo:
bash tests/test.sh — o script de teste usa bash e coreutils (timeout, grep, sed)Instale o Git Bash (incluído no Git for Windows) antes de executar os testes da imagem.
.
├── .github/
├── melange/
│ ├── dasel.yaml
│ └── CVE-2026-33320.patch
├── apko/
│ └── dasel.yaml
├── tests/
│ └── test.sh
├── Makefile
├── compose.yaml
├── keys/ # Gerado, ignorado pelo git
│ ├── melange.rsa
│ └── melange.rsa.pub
├── sbom/ # Gerado, ignorado pelo git
│ ├── sbom-x86_64.spdx.json
│ └── sbom-index.spdx.json
├── packages/ # Gerado, ignorado pelo git
│ └── x86_64/
│ ├── dasel-3.3.1-r0.apk
│ └── APKINDEX.tar.gz
└── README.md
make build # keygen (se necessário) + pacote + imagem
make test # testes do pacote + testes da imagem
make all # compilar + testar
make clean # remover todos os artefactos gerados
make help # listar todos os alvos e variáveis
# 1. Gerar chaves de assinatura (única vez)
docker compose run --rm melange keygen keys/melange.rsa
# 2. Compilar o pacote APK (descarrega a origem, aplica o patch CVE, compila)
docker compose run --rm melange build melange/dasel.yaml --arch x86_64 --signing-key keys/melange.rsa
# 3. Compilar a imagem OCI (consome o APK local)
docker compose run --rm apko build apko/dasel.yaml dasel:3.3.1 dasel.tar --arch x86_64 --sbom-path sbom/
O passo 2 gera e assina automaticamente packages/x86_64/APKINDEX.tar.gz.
Após carregar a imagem, execute o dasel:
docker load --input dasel.tar
# Exemplo: consultar um ficheiro 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'
Estas opções aplicam a camada de runtime da estratégia de defesa em profundidade descrita em Proteção da Imagem: sistema de ficheiros raiz imutável, zero capacidades Linux e sem caminhos de escalada de privilégios.
make test # todos os testes (pacote + imagem)
make package-test # apenas testes do pacote melange
make image-test # apenas testes da imagem (requer bash)
# Testes do pacote
docker compose run --rm melange test melange/dasel.yaml --arch x86_64
# Testes da imagem (requer Git Bash no Windows)
docker load --input dasel.tar
bash tests/test.sh
O script de teste verifica:
dasel version reporta v3.3.1-i json 'test')-i json -o yaml --root)"yaml expansion budget exceeded" em vez de ficar suspensoA vulnerabilidade permite consumo ilimitado de CPU/memória através de aliases YAML aninhados exponencialmente (ataque billion laughs). O patch em melange/CVE-2026-33320.patch adiciona duas medidas de segurança ao leitor YAML do dasel: um limite de profundidade de expansão (32) que limita o aninhamento recursivo de aliases, e um orçamento de expansão (1000) que limita o total de desreferências de alias por documento. Quando qualquer limite é atingido, a descodificação retorna um erro imediatamente.
-trimpath para remover caminhos de compilação locaisA imagem aplica defesa em profundidade além da embalagem mínima:
| Camada | Medida | Efeito |
|---|---|---|
| Compilação | Utilizador não-root (UID 65532) | Processo do contentor nunca executa como root |
| Compilação | -s -w ldflags + auto -trimpath | Binário reduzido, sem fuga de caminhos locais |
| Compilação | 3 pacotes apenas | Superfície de ataque mínima, sem shell ou gestor de pacotes |
| Runtime | --read-only | Sistema de ficheiros raiz imutável |
| Runtime | --cap-drop=ALL | Zero capacidades Linux |
| Runtime | --no-new-privileges | Impede escalada de privilégios via setuid/setgid |
A imagem construída (dasel.tar) foi analisada com ferramentas padrão da indústria para validar a postura de segurança além da correção CVE em si.
O Syft extraiu 36 pacotes da imagem inspecionando os metadados do módulo Go do binário:
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, e mais 25/usr/bin/dasel, /etc/ssl/certs/ca-certificates.crt, APK DB, SBOMs por pacote, e ficheiros de configuração do baselayoutO SBOM que gerei foi inspecionado com o Grype sem outras vulnerabilidades encontradas em qualquer um dos 32 módulos Go ou 3 pacotes APK.
--arch adicionaisbusybox, go, ca-certificates-bundle). Se uma vulnerabilidade for descoberta em algum desses pacotes upstream, afetaria esta imagem também. Manter os pacotes Wolfi atualizados ou subscrever aos seus avisos de segurança seria necessário em produçãocompose.yaml. Isto foi desenvolvido no Kali 2025.3 e verificado no Windows 10 com Docker Desktop 29.3.1tests/test.sh usa timeout (coreutils) e CLI Docker. Todos os outros comandos são docker puro e funcionam a partir do PowerShell ou CMD. No Windows, execute o script de teste a partir do Git Bash (consulte requisitos Windows)O apko gera automaticamente SBOMs SPDX em tempo de compilação na pasta sbom/ (sbom/sbom-x86_64.spdx.json, sbom/sbom-index.spdx.json). Estes monitorizam os 3 pacotes APK instalados com versões, CPEs, proveniência da fonte e referências à definição de compilação do Melange. No entanto, não incluem dependências de módulos Go compiladas no binário dasel. Decidi analisá-los e usei o Syft para fechar esta lacuna, extraindo todos os 32 módulos Go dos metadados incorporados do binário.
Para ambiente de produção, deveria haver alguma automatização da extração do SBOM que verificasse periodicamente. Depois, talvez anexar os resultados do SBOM com algo como https://github.com/nedlir/CVEnotifier que escrevi em Golang para encontrar vulnerabilidades inéditas na cadeia de fornecimento.
| Comando | Resultado |
|---|---|
docker compose run --rm melange keygen keys/melange.rsa | Aprovado |
docker compose run --rm melange build melange/dasel.yaml --arch x86_64 --signing-key keys/melange.rsa | Aprovado - patch aplicado (7/7 hunks), APK produzido |
docker compose run --rm melange test melange/dasel.yaml --arch x86_64 | Aprovado - versão, extração de chave JSON, acesso a array JSON |
docker compose run --rm apko build apko/dasel.yaml dasel:3.3.1 dasel.tar --arch x86_64 --sbom-path sbom/ | Aprovado - 3 pacotes instalados, tarball OCI produzido |
docker load --input dasel.tar | Aprovado - dasel:3.3.1-amd64 carregado |
bash tests/test.sh | Aprovado - todos os testes (versão, extração de chave, conversão de formato, aliases YAML, patch CVE) |
docker run --rm -v ... anchore/grype:latest /work/dasel.tar | Aprovado - 1 descoberta (falso positivo esperado para a CVE corrigida) |
docker run --rm -v ... anchore/syft:latest /work/dasel.tar | Aprovado - 36 pacotes catalogados (3 APK + 32 Go + 1 stdlib) |
Compilações multi-arquitetura - suportar várias arquiteturas para construir este contentor.
Pipeline CI/CD - automatizar compilação + teste no GitHub Actions com ações de contentor melange/apko
SBOM a nível Go no melange - executar syft durante o pipeline de compilação do melange e incorporar o SBOM de módulo Go juntamente com o APK