
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.