
CVE-2026-27280 का गहन विश्लेषण और प्रूफ-ऑफ-कॉन्सेप्ट, जो Adobe DNG SDK के dng_render_task::ProcessArea में एक आउट-ऑफ-बाउंड राइट है, जो Android के इमेज डिकोडिंग API के माध्यम से पहुंच योग्य है, जिसमें रूट कॉज़, शोषण क्षमता मूल्यांकन और RCE गैप विश्लेषण शामिल है।
dng_render_task::ProcessArea में आउट-ऑफ-बाउंड राइट (Adobe DNG SDK / Android)एक सामान्य DNG फ़ाइल से Android के सार्वजनिक इमेज-डिकोडिंग API के माध्यम से पहुँचा गया, और
Galaxy S25 पर फ़ोन के अपने /system/lib64/libdng_sdk.so का उपयोग करके पुनरुत्पादित किया गया।
DNG_REQUIRE(srcArea.Size() == dstArea.Size()) + srcArea इंडेक्सिंग)#12 AImageDecoder_decodeImage /system/lib64/libjnigraphics.so
#11 android::ImageDecoder::decode /system/lib64/libhwui.so
#09 SkCodec::getPixels /system/lib64/libhwui.so
#08 SkRawCodec::onGetPixels /system/lib64/libhwui.so
#07 dng_render::Render() /system/lib64/libdng_sdk.so
#06 SkDngHost::PerformAreaTask /system/lib64/libhwui.so
#00 dng_render_task::ProcessArea /system/lib64/libdng_sdk.so <-- असुरक्षित
ProcessArea srcArea पर एक टाइल-आकार का अस्थायी बफर मैप करता है लेकिन इसे dstArea
निर्देशांकों के साथ इंडेक्स करता है। चूँकि srcArea = dstArea + fSrcOffset और fSrcOffset फ़ाइल का
DefaultCropOrigin है — हर वास्तविक कैमरा DNG में गैर-शून्य — गंतव्य पॉइंटर
fSrcOffset * rowStep * pixelSize द्वारा आवंटन से बाहर विस्थापित हो जाता है, और मास्क रीड-बैक
वहाँ लिखता है। यह एक विस्थापन है, पूर्णांक ओवरफ्लो नहीं, इसलिए इसे किसी विशाल आवंटन की आवश्यकता नहीं है:
यही कारण है कि यह फ़ोन पर पहुँच योग्य है।
01-vulnerability/ dng_render.cpp के असुरक्षित और फिक्स्ड संस्करण, और 2471->2502 डिफ
02-poc/ जनरेटर, लोडर, प्रोब (स्रोत) + प्रीबिल्ट arm64 बाइनरी
03-samples/ DNG फ़ाइलें
04-evidence/ ASAN लॉग, डिवाइस टॉम्बस्टोन, प्रोब आउटपुट
05-analysis/ रूट कॉज़, जनरेटर, पड़ोसी माप, RCE गैप विश्लेषण
वह कार्य जो पहले के निर्णय से आगे जाता है: यह माप द्वारा इसके दो दावों को गलत सिद्ध करता है,
"क्या भ्रष्ट पॉइंटर उपयोग किया गया" का अंतर बंद करता है, और ठीक-ठीक बताता है कि
चेन क्यों रुकती है। पहले 06-rce-lab/README.md पढ़ें; evidence/*.md फ़ाइलें
प्रति-प्रयोग लेख हैं, और src/ + apk/ पुनरुत्पादनीय हार्नेस हैं।
adb push 02-poc/bin-arm64/poc_aimg 03-samples/trigger_natural_croporigin.dng /data/local/tmp/
adb shell "cd /data/local/tmp && chmod 755 poc_aimg && ./poc_aimg trigger_natural_croporigin.dng"
# -> Segmentation fault, libdng_sdk.so के अंदर टॉम्बस्टोन फ्रेम
arm64 लोडर को फिर से बनाने के लिए Android के अपने dng_sdk फ्लैग (से Android.bp) की आवश्यकता होती है, अन्यथा
स्ट्रक्चर लेआउट शिप किए गए लाइब्रेरी से मेल नहीं खाएँगे:
-DUNIX_ENV=1 -DqDNGBigEndian=0 -DqDNGThreadSafe=1 -DqDNGUseLibJPEG=1 \
-DqDNGUseXMP=0 -DqDNGValidateTarget=1 -DqDNGUsingSanitizer=1 -DqLinux=1 -DqAndroid=1
यह CVE-2026-27280 (DNG SDK 1.7.1 2471 और पहले, CWE-787, CVSS 3.1 7.8 HIGH) से मेल खाता है, प्रकाशित 2026-03-10 — संस्करण सीमा और वर्ग द्वारा मिलान किया गया, नहीं Adobe द्वारा फ़ंक्शन का नामकरण करके पुष्टि की गई।
सिद्ध, वास्तविक Android डिकोड पथ पर, 2026-01-01 तक पैच किए गए डिवाइस पर:
हमलावर-चुने गए गंतव्य के साथ आउट-ऑफ-बाउंड राइट (4-बाइट ग्रैन्युलैरिटी, दोनों
दिशाएँ, ASLR-स्वतंत्र); AImageDecoder के माध्यम से एक सादे DNG से पहुँच योग्य,
Samsung Gallery को उसके थंबनेल लोडर में मारते हुए प्रदर्शित; पड़ोसियों का मौन नियतात्मक
भ्रष्टाचार; free() तक पहुँचने वाला एक भ्रष्ट पॉइंटर (N1 बंद); DNG प्रारूप द्वारा व्यक्त
हीप-स्प्रे (ImageStats × SubIFD); उन स्प्रे की गई वस्तुओं पर लक्षित राइट, 6/10 बनाम 0/10।
RCE नहीं, Android पथ पर, और एक मूल कारण के लिए: कोड एक एकल मान,
0x3F800000 लिख सकता है। सब कुछ उसी से अनुसरण करता है — राइट सन्निहित है (Scudo हेडर पर कोई स्ट्राइड नहीं),
लिखने के लिए कोई शून्य नहीं है (कोई लंबाई/रेफकाउंट भ्रष्टाचार नहीं), और
टैग-संरक्षण आंशिक ओवरराइट में ठीक एक निश्चित लक्ष्य ऑफसेट है। एक मान
यादृच्छिक 256 MB आरक्षण के खिलाफ एक मौका है, और कोई भी स्प्रे मात्रा या
समवर्तीता मौके नहीं जोड़ती। डेस्कटॉप SDK पर लिखने योग्य सेट 256 मान है → ~67 MB बैंड में 256 मौके,
यही कारण है कि 7.8 वहाँ सही है।
पहले के निर्णय से वापस लिया गया (05-analysis/05-exploitability-verdict.md),
माप द्वारा गलत सिद्ध: "एक वास्तविक डिकोडर कोई स्प्रे प्रिमिटिव प्रदान नहीं करता" और "ओवरलैप
एकल डिकोड के अंदर से नियंत्रणीय नहीं है"। ब्लॉक PAC, BTI या
Scudo की चेकसम नहीं है — यह एकल लिखने योग्य मान है, कोड का एक गुण जिसे Adobe का
2502 फिक्स srcArea के साथ इंडेक्सिंग करके जड़ से हटा देता है।
कोई कार्यशील एक्सप्लॉइट नहीं बनाया गया, और यहाँ कोई प्रकाशित नहीं है।
| फ़ाइल | यह क्या करती है |
|---|
trigger_natural_croporigin.dng | प्राकृतिक ज्यामिति (DefaultCropOrigin = 8,8); AImageDecoder को क्रैश करता है |
benign_reference.dng | मूल 0 वाली वही फ़ाइल — ठीक से डिकोड होती है, हीप की जाँच के लिए उपयोग की जाती है |
silent_corruption.dng | छोटा साइज़ क्लास: बिना क्रैश हुए आउट-ऑफ-बाउंड लिखता है (5/5) |
far_write_crash.dng | बड़ा विस्थापन: स्पष्ट रूप से फॉल्ट करता है |
| फ़ाइल | सामग्री |
|---|
01-root-cause.md | बग, फिक्स, राइट का आकार |
02-dng-generator.md | ट्रिगर फ़ाइल कैसे बनाई जाती है, दो ट्यूनिंग नॉब, नुकसान |
03-neighbours.md | नियंत्रणीयता संख्याएँ, बफर के बगल में क्या है, शमन |
04-what-is-missing-for-rce.md | क्या सिद्ध है (P1-P8), क्या नहीं (N1-N3), शेष चरण |
05-exploitability-verdict.md | पहले का निर्णय — 06-rce-lab द्वारा प्रतिस्थापित, रिकॉर्ड के लिए रखा गया |
| फ़ाइल | सामग्री |
|---|
EXP1-stride-vs-scudo.md | स्ट्राइड बनाम Scudo हेडर: अमूर्त रूप से संभव, Android पथ पर असंभव (planes==1) |
EXP2-N1-corrupted-pointer-used.md | एक भ्रष्ट पॉइंटर free() तक पहुँचता है — N1 बंद |
EXP2-real-process.md | वास्तविक Samsung Gallery प्रक्रिया में राइट, कुछ भी नहीं लगाया गया |
EXP-imagestats-spray.md | हीप-स्प्रे जिसे पहले का निर्णय असंभव कहता था, DNG प्रारूप द्वारा व्यक्त |
EXP-aimed-spray.md | स्प्रे की गई वस्तुओं पर राइट को लक्षित करना: 6/10 बनाम 0/10 |
EXP-small-class-in-app.md | वास्तविक ऐप प्रक्रिया के अंदर पहुँच में कोड पॉइंटर |
EXP-band-commit.md / EXP-concurrency.md | लक्ष्य को कमिट करना क्यों विफल होता है: एक लिखने योग्य मान = एक मौका |
EXP-write-read-mismatch.md | दूसरा दोष + ProcessArea का पूर्ण स्रोत ऑडिट |
EXP-value-1.0f.md | 1.0f-एज़-डेटम मार्ग, संरचनात्मक रूप से बंद |