
Упражнение для кандидата уровня Junior Backend: упаковка CLI dasel (v3.3.1) с помощью Melange, исправление CVE-2026-33320 и создание минимального образа контейнера с помощью Apko.
Пакет dasel v3.3.1 с Melange, сборка контейнерного образа с apko и исправление CVE-2026-33320.
Предварительные требования: Docker. Все шаги сборки выполняются внутри контейнеров — не требуется локальной установки melange/apko. Все команды запускаются из корня репозитория на linux/amd64 (или Docker Desktop с эмуляцией linux/amd64).
Шаг 0 — Генерация ключа подписи (однократно)
docker run --rm -v "/${PWD}":/work cgr.dev/chainguard/melange keygen
Шаг 1 — Сборка пакета
docker run --privileged --rm -v "/${PWD}":/work cgr.dev/chainguard/melange build melange/dasel.yaml --arch amd64 --signing-key melange.rsa
Результат: packages/x86_64/dasel-3.3.1-r1.apk
Шаг 2 — Тестирование пакета
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
Шаг 3 — Сборка образа
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
Результат: dasel-image.tar. Репозиторий @local ./packages в apko/dasel.yaml заставляет apko установить APK, собранный на Шаге 1. -k позволяет apko доверять ключу подписи Melange. apko добавляет архитектуру к тегу, поэтому загруженный образ будет dasel-image:latest-amd64.
Шаг 4 — Загрузка образа
docker load --input dasel-image.tar
Шаг 5 — Запуск тестов образа
bash tests/test.sh
Десять тестов: наличие и запуск бинарного файла, запрос плоского ключа JSON, архитектура amd64, бюджет CVE отклоняет бомбу с алиасами YAML, обычное чтение YAML (зелёный путь), вложенный путь JSON, доступ по индексу массива, формат TOML, ограничение глубины CVE отклоняет цепочку алиасов из 33 уровней, неверный JSON отклонён.
melange/CVE-2026-33320.patch добавляет два ограничения в parsing/yaml/yaml_reader.go:
maxExpansionDepth = 32 — отклоняет цепочки алиасов глубже 32 уровнейmaxExpansionBudget = 100 — отклоняет документы с более чем 100 разрешениями алиасов в суммеОба возвращают ненулевой код завершения с сообщением, содержащим yaml expansion. Тест 4 в tests/test.sh проверяет это.
Команды выполняются: melange keygen → melange build → melange test → apko build → docker load → tests/test.sh
Все шаги пройдены на linux/amd64.
Что я улучшил бы при наличии времени:
test.sh