
Exercício para Candidato Júnior de Backend: Empacotar a CLI dasel (v3.3.1) com Melange, corrigir a CVE-2026-33320 e construir uma imagem de contêiner mínima usando Apko.
Pacote dasel v3.3.1 com Melange, construir uma imagem de contêiner com apko e corrigir a CVE-2026-33320.
Pré-requisitos: Docker. Todas as etapas de build são executadas dentro de contêineres — nenhuma instalação local de melange/apko é necessária. Execute todos os comandos a partir da raiz do repositório em linux/amd64 (ou Docker Desktop com emulação de linux/amd64).
Etapa 0 — Gerar chave de assinatura (única vez)
docker run --rm -v "/${PWD}":/work cgr.dev/chainguard/melange keygen
Etapa 1 — Build do pacote
docker run --privileged --rm -v "/${PWD}":/work cgr.dev/chainguard/melange build melange/dasel.yaml --arch amd64 --signing-key melange.rsa
Saída: packages/x86_64/dasel-3.3.1-r1.apk
Etapa 2 — Testar o pacote
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
Etapa 3 — Build da imagem
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
Saída: dasel-image.tar. O repositório @local ./packages em apko/dasel.yaml faz com que o apko instale o APK que você compilou na Etapa 1. A opção -k permite que o apko confie na chave de assinatura Melange. O apko adiciona a arquitetura à tag, portanto a imagem carregada é dasel-image:latest-amd64.
Etapa 4 — Carregar a imagem
docker load --input dasel-image.tar
Etapa 5 — Executar os testes de imagem
bash tests/test.sh
Dez testes: binário presente e executável, consulta de chave JSON simples, arquitetura é amd64, limite de orçamento de CVE rejeita uma bomba de alias YAML, leitura normal de YAML no caminho de sucesso, caminho JSON aninhado, acesso a índice de array, formato TOML, limite de profundidade de CVE rejeita uma cadeia de alias de 33 níveis, JSON malformado rejeitado.
melange/CVE-2026-33320.patch adiciona duas proteções em parsing/yaml/yaml_reader.go:
maxExpansionDepth = 32 — rejeita cadeias de alias com mais de 32 níveis de profundidademaxExpansionBudget = 100 — rejeita documentos com mais de 100 resoluções de alias no totalAmbas retornam um código de saída diferente de zero com uma mensagem contendo yaml expansion. O teste 4 em tests/test.sh verifica isso.
Comandos executados: melange keygen → melange build → melange test → apko build → docker load → tests/test.sh
Todas as etapas passaram em linux/amd64.
O que eu melhoraria com mais tempo:
test.sh