
dasel v3.3.1 को Melange के साथ पैकेज किया गया और न्यूनतम apko छवि के रूप में भेजा गया, CVE-2026-33320 के लिए पैच किया गया।
यह रिपॉज़िटरी dasel CLI (v3.3.1) को Melange के साथ एक APK के रूप में पैकेज करती है, apko के साथ एक न्यूनतम कंटेनर इमेज बनाती है, और v3.3.1 कोडबेस पर बने रहते हुए CVE-2026-33320 के लिए एक फिक्स लागू करती है (वर्जन बढ़ाना नहीं, बल्कि एक पैच)।
परिणाम ~4 MB की एक इमेज है जिसमें केवल स्टैटिक dasel बाइनरी है — कोई शेल नहीं, कोई पैकेज मैनेजर नहीं, कोई libc नहीं — जो एक गैर-रूट उपयोगकर्ता के रूप में चलती है।
melange/
dasel.yaml # melange recipe: fetch v3.3.1, apply the patch, build the .apk
apko/
dasel.yaml # apko recipe: assemble a minimal image from the local .apk
patches/
cve-2026-33320.patch # the CVE fix (minimal backport of upstream 282943b onto v3.3.1)
NOTES.md # what the CVE is, severity, and how the fix works
tests/
test.sh # runs the built IMAGE and asserts real behavior + the CVE fix
README.md
melange और apko PATH पर।विकास के दौरान उपयोग किए गए संस्करण:
| उपकरण | संस्करण |
|---|---|
| melange | 0.50.8 |
| apko | 1.2.14 |
| Docker | 29.5.2 |
नीचे दिए गए सभी कमांड रिपॉज़िटरी के रूट से चलाए जाते हैं।
melange keygen
melange.rsa (निजी) और melange.rsa.pub (सार्वजनिक) बनाता है। दोनों gitignored हैं — कुंजियाँ उस व्यक्ति द्वारा पुनः उत्पन्न की जाती हैं जो बिल्ड को दोहराता है, कभी कमिट नहीं की जातीं।
melange build melange/dasel.yaml \
--source-dir patches \
--signing-key melange.rsa \
--arch x86_64 \
--runner docker
--source-dir patches बिल्ड सैंडबॉक्स के अंदर patches/cve-2026-33320.patch उपलब्ध कराता है, जहाँ रेसिपी का patch चरण इसे लागू करता है। आउटपुट: packages/x86_64/dasel-3.3.1-r0.apk (हस्ताक्षरित) और packages/x86_64/APKINDEX.tar.gz।
melange test नए बने .apk को एक स्वच्छ वातावरण में स्थापित करता है और रेसिपी के test: ब्लॉक को चलाता है। इसे Wolfi रिपॉज़िटरी (busybox के लिए) और हमारी स्थानीय packages/ रिपॉज़िटरी (dasel के लिए) की आवश्यकता होती है, प्रत्येक अपनी साइनिंग कुंजी के साथ:
melange test melange/dasel.yaml dasel \
--arch x86_64 --runner docker \
--repository-append https://packages.wolfi.dev/os \
--keyring-append https://packages.wolfi.dev/os/wolfi-signing.rsa.pub \
--repository-append "$(pwd)/packages" \
--keyring-append melange.rsa.pub
जाँच करता है: dasel version 3.3.1 बताता है; एक वास्तविक JSON क्वेरी; एक JSON→YAML रूपांतरण; और यह कि एक billion-laughs YAML बम अस्वीकार कर दिया जाता है विस्तार गार्ड द्वारा (CVE-2026-33320 ठीक हो गया)।
apko build apko/dasel.yaml dasel:test dasel.tar --arch x86_64
docker load < dasel.tar
आउटपुट: dasel.tar (एक लोड करने योग्य OCI इमेज) और एक SBOM (SPDX JSON)। apko टैग में आर्किटेक्चर जोड़ता है, इसलिए लोड की गई इमेज dasel:test-amd64 है।
इमेज स्थानीय रूप से बने पैकेज का उपभोग कैसे करती है (मुख्य बाधा)। apko/dasel.yaml ./packages को एक रिपॉज़िटरी के रूप में और ./melange.rsa.pub को एक कीरिंग के रूप में सूचीबद्ध करता है। इसलिए apko उसी सटीक dasel APK को स्थापित करता है जिसे melange build ने packages/x86_64/ में लिखा था — हमारी अपनी साइनिंग कुंजी के विरुद्ध सत्यापित — और नहीं कोई प्रीबिल्ट अपस्ट्रीम पैकेज। (रिपॉज़िटरी के रूट से apko build चलाएँ ताकि वे सापेक्ष पथ हल हो सकें।) यही पैकेज बिल्ड को इमेज बिल्ड से जोड़ता है।
./tests/test.sh
docker run के माध्यम से इमेज चलाता है और जाँच करता है (5 जाँचें): dasel मौजूद है और v3.3.1 बताता है, एक नेस्टेड JSON क्वेरी, एक JSON→YAML रूपांतरण, एक ऐरे-इंडेक्स क्वेरी, और YAML बम अस्वीकृत। कोई भी जाँच विफल होने पर स्क्रिप्ट गैर-शून्य (non-zero) स्थिति के साथ बाहर निकलती है (ताकि यह CI को गेट कर सके)। टैग को IMAGE=<tag> ./tests/test.sh के साथ ओवरराइड करें।
CVE-2026-33320 dasel के YAML रीडर में एक denial-of-service (CWE-674, अनियंत्रित recursion) है: असीमित YAML alias विस्तार के माध्यम से "billion laughs" हमला। dasel ने अपना स्वयं का UnmarshalYAML लागू किया और alias नोड्स को बिना किसी सीमा के पुनरावर्ती रूप से हल किया, जिससे अंतर्निहित लाइब्रेरी की अंतर्निहित सुरक्षा को दरकिनार कर दिया गया।
हम v3.3.1 स्रोत पर patches/cve-2026-33320.patch के रूप में केवल अपस्ट्रीम फिक्स (कमिट 282943b, v3.3.2 में जारी) को बैकपोर्ट करते हैं। यह विस्तार को गहराई सीमा (32) और एक साझा बजट (1000) से बांधता है, बिना सीमा के विस्तार करने के बजाय एक त्रुटि लौटाता है। हम जानबूझकर उन असंबंधित बग फिक्सों को बाहर रखते हैं जो v3.3.2 में भी जारी हुए थे, जिससे परिवर्तन न्यूनतम और ऑडिट योग्य बना रहे। पूर्ण विवरण के लिए patches/NOTES.md देखें।
git-checkout expected-commit को v3.3.1 कमिट SHA पर पिन करता है, इसलिए यदि टैग को कभी भिन्न कोड पर पुनः इंगित किया जाता है तो बिल्ड विफल हो जाता है (सप्लाई-चेन सुरक्षा)।CGO_ENABLED=0 के साथ बनाया गया (रेसिपी के बिल्ड वातावरण में सेट), इसलिए बाइनरी में कोई cgo और कोई साझा-लाइब्रेरी निर्भरता नहीं है — यही कारण है कि इमेज बिना libc/शेल/पैकेज-मैनेजर के जारी की जा सकती है।packages: सूची केवल dasel है; इमेज केवल हमारा स्थानीय रूप से बना पैकेज स्थापित करती है (हमारे melange.rsa.pub से सत्यापित)।nonroot) के रूप में चलती है।x86_64 के लिए बिल्ड (विकास मशीन का आर्किटेक्चर)।docker का उपयोग (bubblewrap मूल Linux पर भी काम करेगा)।/etc/os-release नहीं); इमेज में किसी चीज़ को इसकी आवश्यकता नहीं है। यह एक जानबूझकर न्यूनतमता का विकल्प है, जिसे wolfi-baselayout जोड़कर आसानी से उलटा जा सकता है।go और busybox को खींचता है, इसलिए यह मानता है कि Wolfi Go ≥ 1.25 (dasel की go.mod आवश्यकता) परोसता रहता है। dasel स्रोत कमिट द्वारा पिन किया गया है; बिल्ड टूलचेन को भी पिन करने से बिल्ड पूरी तरह से हर्मेटिक हो जाएगा (नीचे देखें)।go/busybox स्नैपशॉट) और एक निश्चित बिल्ड तिथि को पिन करना, ताकि पूरी तरह से हर्मेटिक, बिट-दर-बिट प्रतिलिपि योग्य बिल्ड प्राप्त हो (स्रोत पहले से ही कमिट-पिन है)।aarch64)।melange build + melange test: पैकेज बिल्ड होता है, पैच सफाई से लागू होता है (सभी 7 हंक — 1 in parsing/yaml/yaml.go, 6 in parsing/yaml/yaml_reader.go), CVE बम परीक्षण सहित सभी पैकेज परीक्षण सफल हैं।apko build + tests/test.sh: इमेज बिल्ड होती है (~4 MB सामग्री), सभी 5 इमेज परीक्षण सफल हैं।