
حزمة وصورة 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 لإزالة مسارات البناء المحليةتطبّق الصورة الدفاع المتعمق أبعد من التغليف الأدنى:
| الطبقة | الإجراء | التأثير |
|---|---|---|
| البناء | مستخدم غير جذر (UID 65532) | عملية الحاوية لا تعمل أبدًا كجذر |
| البناء | -s -w ldflags + -trimpath تلقائي | ثنائي مجرّد، لا تسريب لمسار محلي |
| البناء | 3 حزم فقط | سطح هجوم أدنى، لا قشرة ولا مدير حزم |
| وقت التشغيل | --read-only | نظام ملفات جذر غير قابل للتغيير |
| وقت التشغيل | --cap-drop=ALL | صفر من قدرات Linux |
| وقت التشغيل | --no-new-privileges | يمنع تصعيد الامتيازات عبر setuid/setgid |
تم فحص الصورة المبنية (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