
حزمة وصورة dasel v3.3.1 المُحصّنة والمُبنية عبر Melange وapko. تصحيح لـ CVE-2026-33320.
هذه حزمة melange وصورة حاوية apko لـ dasel v3.3.1 مع تصحيح وقت البناء لـ CVE-2026-33320 (توسّع غير محدود للأسماء المستعارة في YAML). الصورة مبنية بالكامل من APK مُنتج محليًا - لا تُستخدم أي صورة جاهزة من المصدر الأصلي.
| الأداة | الإصدار المختبر | الغرض |
|---|---|---|
| Docker | 29.3.1 | وقت تشغيل الحاويات، يشغّل melange/apko عبر compose.yaml |
| melange | 0.50.5 (Docker image cgr.dev/chainguard/melange@sha256:b6f11bb45a6090c182986028fd2249fb1a18dcb6e173c4ce001dd3fb4cb1dd71) | باني حزم APK |
| apko | 1.2.10 (Docker image cgr.dev/chainguard/apko@sha256:20dfc1f5e3461b5eaf3279f762cd4bf86c7f3635d2a9642f905cf583525f9ee6) | باني صور OCI |
تعمل جميع أوامر البناء والتحميل من أي طرفية (PowerShell أو CMD أو bash). لا تزال خطوة واحدة تتطلب قشرة Unix:
bash tests/test.sh — يستخدم سكربت الاختبار bash وcoreutils (timeout وgrep وsed)ثبّت Git Bash (يأتي مع Git for Windows) قبل تشغيل اختبارات الصورة.
.
├── .github/
├── melange/
│ ├── dasel.yaml
│ └── CVE-2026-33320.patch
├── apko/
│ └── dasel.yaml
├── tests/
│ └── test.sh
├── Makefile
├── compose.yaml
├── keys/ # Generated, gitignored
│ ├── melange.rsa
│ └── melange.rsa.pub
├── sbom/ # Generated, gitignored
│ ├── sbom-x86_64.spdx.json
│ └── sbom-index.spdx.json
├── packages/ # Generated, gitignored
│ └── x86_64/
│ ├── dasel-3.3.1-r0.apk
│ └── APKINDEX.tar.gz
└── README.md
make build # keygen (if needed) + package + image
make test # package tests + image tests
make all # build + test
make clean # remove all generated artifacts
make help # list all targets and variables
# 1. Generate signing keys (one-time)
docker compose run --rm melange keygen keys/melange.rsa
# 2. Build the APK package (fetches source, applies CVE patch, compiles)
docker compose run --rm melange build melange/dasel.yaml --arch x86_64 --signing-key keys/melange.rsa
# 3. Build the OCI image (consumes the local APK)
docker compose run --rm apko build apko/dasel.yaml dasel:3.3.1 dasel.tar --arch x86_64 --sbom-path sbom/
تنشئ الخطوة 2 وتوقّع تلقائيًا packages/x86_64/APKINDEX.tar.gz.
بعد تحميل الصورة، شغّل dasel:
docker load --input dasel.tar
# Example: query a JSON file
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'
تفرض هذه العلامات طبقة وقت التشغيل لاستراتيجية الدفاع المتعمق الموصوفة في تحصين الصورة: نظام ملفات جذر غير قابل للتغيير، صفر من قدرات Linux، ولا مسارات لتصعيد الامتيازات.
make test # all tests (package + image)
make package-test # melange package tests only
make image-test # image tests only (requires bash)
# Package tests
docker compose run --rm melange test melange/dasel.yaml --arch x86_64
# Image tests (requires Git Bash on Windows)
docker load --input dasel.tar
bash tests/test.sh
يتحقق سكربت الاختبار من:
dasel version يعرض v3.3.1-i json 'test')-i json -o yaml --root)"yaml expansion budget exceeded" بدلًا من التعلّقتتيح الثغرة استهلاكًا غير محدود لوحدة المعالجة المركزية/الذاكرة عبر أسماء YAML المستعارة المتداخلة بشكل أسي (هجوم billion laughs). يضيف التصحيح في melange/CVE-2026-33320.patch ضابطتي أمان لقارئ YAML في dasel: حدًا لعمق التوسّع (32) يحدّ من التداخل التكراري للأسماء المستعارة، وميزانية توسّع (1000) تحدّ من إجمالي عمليات إلغاء مرجعية الأسماء المستعارة لكل مستند. عند بلوغ أي من الحدّين، يعيد فك الترميز خطأً فورًا.
-trimpath لإزالة مسارات البناء المحليةتطبّق الصورة الدفاع المتعمق أبعد من التغليف الأدنى:
تم فحص الصورة المبنية (dasel.tar) باستخدام أدوات قياسية في الصناعة للتحقق من الوضع الأمني أبعد من تصحيح CVE نفسه.
استخرجت Syft 36 حزمة من الصورة بفحص بيانات وحدات ثنائي Go:
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 و25 وحدة أخرى/usr/bin/dasel و/etc/ssl/certs/ca-certificates.crt وAPK DB وملفات SBOM لكل حزمة وملفات إعداد baselayoutتم فحص SBOM الذي أنشأته باستخدام Grype، ولم يُعثر على أي ثغرات أخرى في أي من وحدات Go الـ32 أو حزم APK الثلاث.
x86_64 فقط - بناء أحادي البنية. البناء متعدد البنيات يتطلب أعلام --arch إضافية
مفاتيح توقيع مؤقتة - تُنشأ محليًا ومستثناة عبر git (gitignored). في بيئة الإنتاج، يجب تخزين مفاتيح التوقيع الخاصة في مدير أسرار، وليس على نظام الملفات المحلي، حتى لو كان يمكن كشف الملفات المستثناة عبر git من خلال أدوات النسخ الاحتياطي أو تحميل وحدات تخزين الحاويات أو محطة عمل مخترقة.
اعتماد على نظام Wolfi OS - يعتمد البناء والصورة النهائية على حزم Wolfi (busybox وgo وca-certificates-bundle). إذا اكتُشفت ثغرة في أي من تلك الحزم الأصلية، فستؤثر على هذه الصورة أيضًا. سيكون تحديث حزم Wolfi أو الاشتراك في نشراتها الأمنية ضروريًا في الإنتاج
غلافات Docker Compose - يعمل melange وapko كحاويات Docker عبر compose.yaml. طُوّر هذا على Kali 2025.3 وتُحقق منه على Windows 10 باستخدام Docker Desktop 29.3.1
سكربت الاختبار يتطلب bash - يستخدم tests/test.sh أداة timeout (من coreutils) وواجهة Docker CLI. جميع الأوامر الأخرى هي docker خالصة وتعمل من PowerShell أو CMD. على Windows، شغّل سكربت الاختبار من Git Bash (انظر متطلبات Windows)
تُنشئ apko تلقائيًا ملفات SBOM بصيغة SPDX وقت البناء داخل مجلد sbom/ (sbom/sbom-x86_64.spdx.json وsbom/sbom-index.spdx.json). تتعقّب هذه الملفات حزم APK الثلاث المثبتة مع الإصدارات وCPEs ومصدر البرنامج ومراجع تعريف بناء Melange. ومع ذلك، فهي لا تتضمن تبعيات وحدات Go المترجمة داخل ثنائي dasel. قررت فحصها واستخدمت Syft لسد هذه الفجوة باستخراج جميع وحدات Go الـ32 من البيانات الوصفية المضمّنة في الثنائي.
بالنسبة لبيئة الإنتاج، يجب أن تكون هناك أتمتة لاستخراج SBOM تستعلم بشكل دوري. ثم ربما إرفاق نتائج SBOM بشيء مثل https://github.com/nedlir/CVEnotifier الذي كتبته بلغة Golang للعثور على ثغرات جديدة في سلسلة التوريد.
بناءات متعددة البنيات - دعم بنيات متعددة لبناء هذه الحاوية.
خط أنابيب CI/CD - أتمتة البناء والاختبار في GitHub Actions باستخدام إجراءات حاويات melange/apko
SBOM على مستوى Go في melange - تشغيل syft أثناء خط أنابيب بناء melange ودمج SBOM لوحدات Go بجانب APK
| الطبقة | الإجراء | التأثير |
|---|
| البناء | مستخدم غير جذر (UID 65532) | عملية الحاوية لا تعمل أبدًا كجذر |
| البناء | -s -w ldflags + -trimpath تلقائي | ثنائي مجرّد، لا تسريب لمسار محلي |
| البناء | 3 حزم فقط | سطح هجوم أدنى، لا قشرة ولا مدير حزم |
| وقت التشغيل | --read-only | نظام ملفات جذر غير قابل للتغيير |
| وقت التشغيل | --cap-drop=ALL | صفر من قدرات Linux |
| وقت التشغيل | --no-new-privileges | يمنع تصعيد الامتيازات عبر setuid/setgid |
| الأمر | النتيجة |
|---|
docker compose run --rm melange keygen keys/melange.rsa | نجح |
docker compose run --rm melange build melange/dasel.yaml --arch x86_64 --signing-key keys/melange.rsa | نجح - تم تطبيق التصحيح (7/7 مقاطع)، وتم إنتاج APK |
docker compose run --rm melange test melange/dasel.yaml --arch x86_64 | نجح - الإصدار، استخراج مفتاح JSON، الوصول إلى مصفوفة JSON |
docker compose run --rm apko build apko/dasel.yaml dasel:3.3.1 dasel.tar --arch x86_64 --sbom-path sbom/ | نجح - تم تثبيت 3 حزم، وتم إنتاج أرشيف OCI |
docker load --input dasel.tar | نجح - تم تحميل dasel:3.3.1-amd64 |
bash tests/test.sh | نجح - جميع الاختبارات (الإصدار، استخراج المفاتيح، تحويل التنسيق، أسماء YAML المستعارة، تصحيح CVE) |
docker run --rm -v ... anchore/grype:latest /work/dasel.tar | نجح - اكتشاف واحد (إيجابي كاذب متوقع للـ CVE المُصحّح) |
docker run --rm -v ... anchore/syft:latest /work/dasel.tar | نجح - تم فهرسة 36 حزمة (3 APK + 32 Go + 1 stdlib) |