Android Media Pipelines और Image Parsers का दुरुपयोग
Tip
AWS हैकिंग सीखें और अभ्यास करें:
HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें:HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
Delivery: Messaging Apps ➜ MediaStore ➜ Privileged Parsers
आधुनिक OEM बिल्ड अक्सर privileged media indexers चलाते हैं जो “AI” या शेयरिंग फीचर्स के लिए MediaStore को नियमित रूप से फिर से स्कैन करते हैं। Samsung firmware पर April 2025 patch से पहले, com.samsung.ipservice Quram (/system/lib64/libimagecodec.quram.so) को लोड करता है और स्वचालित रूप से उन किसी भी फ़ाइल को parse कर लेता है जिन्हें WhatsApp (या अन्य ऐप्स) MediaStore में डालते हैं। व्यवहार में, एक attacker IMG-*.jpg के रूप में भेस किया गया एक DNG भेज सकता है, पीड़ित के “download” (1-क्लिक) पर टैप करने का इंतज़ार कर सकता है, और privileged service payload को parse कर लेगा भले ही user कभी gallery न खोले।
$ file IMG-2025-02-10.jpeg
TIFF image data ...
$ exiftool IMG-2025-02-10.jpeg | grep "Opcode List"
Opcode List 1 : [opcode 23], [opcode 23], ...
मुख्य निष्कर्ष
- डिलीवरी system media re-parsing (not the chat client) पर निर्भर करती है और इसलिए यह उस प्रक्रिया की permissions inherited कर लेती है (gallery के लिए full read/write access, नए media डालने की क्षमता, आदि)।
- कोई भी image parser जो
MediaStoreके माध्यम से पहुँच योग्य है (vision widgets, wallpapers, AI résumé features, आदि) दूर से पहुँच योग्य बन जाता है अगर attacker लक्ष्य को मीडिया save करने के लिए राज़ी कर सके।
Quram के DNG Opcode Interpreter बग
DNG फ़ाइलें तीन opcode सूचियाँ embed करती हैं जो अलग decode stages पर लागू होती हैं। Quram Adobe के API की नकल करता है, लेकिन इसका Stage-3 handler DeltaPerColumn (opcode ID 11) attacker-सप्लाई किए गए plane bounds पर भरोसा करता है।
DeltaPerColumn में plane bounds का विफल होना
- Attackers
plane=5125औरplanes=5123सेट करते हैं जबकि Stage-3 images केवल planes 0–2 (RGB) ही एक्सपोज़ करते हैं। - Quram
opcode_last_plane = image_planes + opcode_planescompute करता है न किplane + count, और कभी यह चेक नहीं करता कि प्राप्त plane range image के भीतर फिट होता है या नहीं। - इसलिए loop
raw_pixel_buffer[plane_index]पर एक delta लिखता है एक पूरी तरह नियंत्रित offset के साथ (उदा., plane 5125 ⇒ offset5125 * 2 bytes/pixel = 0x2800)। हर opcode लक्षित स्थान पर 16-bit float मान (0x6666) जोड़ता है, जिससे एक सटीक heap OOB add primitive बनता है।
increments को arbitrary writes में बदलना
- exploit पहले Stage-3
QuramDngImage.bottom/rightको 480 malformedDeltaPerColumnऑपरेशनों से corrupt करता है ताकि आने वाले opcodes विशाल coordinates को in-bounds मानें। - फिर
MapTableopcodes (opcode 7) को उन नकली bounds पर निशाना बनाया जाता है। सभी zeros वाला substitution table या-Infdeltas वालाDeltaPerColumnइस्तेमाल करके, attacker किसी भी क्षेत्र को zero कर देता है, फिर अतिरिक्त deltas लागू करके सटीक मान लिखता है। - क्योंकि opcode parameters DNG metadata के अंदर रहते हैं, payload सैकड़ों हजारों writes encode कर सकता है बिना process memory को सीधे छुए।
Scudo के तहत Heap Shaping
Scudo allocations को size के हिसाब से buckets करता है। Quram कुछ ऑब्जेक्ट्स को identical 0x30-byte chunk sizes में allocate करता है, इसलिए वे एक ही region में land होते हैं (heap पर 0x40-byte spacing):
QuramDngImagedescriptors for Stage 1/2/3QuramDngOpcodeTrimBoundsand vendorUnknownopcodes (ID ≥14, including ID 23)
Exploit allocations की sequence बनाता है ताकि chunks deterministic तरीके से place हों:
- Stage-1
Unknown(23)opcodes (20,000 entries) 0x30 chunks spray करते हैं जो बाद में free होते हैं। - Stage-2 उन opcodes को free करता है और freed region के अंदर नया
QuramDngImageरखता है। - 240 Stage-2
Unknown(23)entries free किए जाते हैं, और Stage-3 तुरंत अपनाQuramDngImageऔर उसी साइज का नया raw pixel buffer allocate करता है, उन spots को reuse करते हुए। - एक crafted
TrimBoundsopcode list 3 में पहले चलता है और Stage-2 state को free करने से पहले एक और raw pixel buffer allocate करता है, यह सुनिश्चित करता है कि “raw pixel buffer ➜ QuramDngImage” adjacency रहे। - 640 अतिरिक्त
TrimBoundsentries कोminVersion=1.4.0.1के रूप में चिह्नित किया गया है ताकि dispatcher उन्हें skip करे, पर उनके backing objects allocated रहते हैं और बाद में primitive targets बन जाते हैं।
यह choreography Stage-3 raw buffer को तुरंत Stage-3 QuramDngImage से पहले रख देता है, इसलिए plane-based overflow descriptor के अंदर फ़ील्ड्स फ्लिप कर देता है बजाय कि random state crash होने के।
Vendor “Unknown” Opcodes को Data Blobs के रूप में पुन: उपयोग करना
Samsung vendor-specific opcode IDs में high bit सेट रखता है (उदा., ID 23), जो interpreter को उस structure को allocate करने का निर्देश देता है पर execution छोड़ देता है। exploit उन dormant objects को attacker-controlled heaps के रूप में abuse करता है:
- Opcode list 1 और 2 के
Unknown(23)entries contiguous scratchpads के रूप में काम करते हैं payload bytes स्टोर करने के लिए (JOP chain offset 0xf000 पर और shell command 0x10000 पर raw buffer के सापेक्ष)। - क्योंकि interpreter तब भी प्रत्येक object को opcode के रूप में मानता है जब list 3 process की जाती है, किसी एक object की vtable पर कब्ज़ा कर लेना बाद में attacker data के execution को शुरू करने के लिए पर्याप्त होता है।
Bogus MapTable Objects बनाना & ASLR को बायपास करना
MapTable objects TrimBounds से बड़े होते हैं, लेकिन एक बार layout corruption हो जाने पर parser खुशी-खुशी extra parameters आउट-ऑफ-बाउंड पढ़ लेता है:
- linear write primitive का उपयोग करके partial रूप से एक
TrimBoundsvtable pointer को overwrite किया जाता है एक craftedMapTablesubstitution table से जो lower 2 bytes को पड़ोसीTrimBoundsvtable सेMapTablevtable पर map करता है। supported Quram builds के बीच केवल low bytes अलग होते हैं, इसलिए एक single 64K lookup table सात firmware versions और हर 4 KB ASLR slide को संभाल सकता है। - बाकी
TrimBoundsफ़ील्ड्स (top/left/width/planes) को patch किया जाता है ताकि object बाद में execute होने पर वैधMapTableजैसा व्यवहार करे। - zeroed memory पर fake opcode execute किया जाता है। क्योंकि substitution table pointer असल में किसी दूसरे opcode की vtable को reference करता है, output bytes leaked low-order addresses बन जाते हैं from
libimagecodec.quram.soया उसकी GOT। - अतिरिक्त
MapTableपास लागू करके उन two-byte leaks को उन gadgets की ओर offsets में convert किया जाता है जैसे__ink_jpeg_enc_process_image+64,QURAMWINK_Read_IO2+124,qpng_check_IHDR+624, और libc का__system_property_getentry। attackers प्रभावी तौर पर अपने sprayed opcode region के अंदर native memory disclosure APIs के बिना full addresses reconstruct कर लेते हैं।
JOP ➜ system() ट्रांज़िशन ट्रिगर करना
एक बार gadget pointers और shell command opcode spray के अंदर staged हो जाएँ:
- अंतिम wave के
DeltaPerColumnwrites Stage-3QuramDngImageके offset 0x22 पर0x0100जोड़ते हैं, जिससे उसका raw buffer pointer 0x10000 से शिफ्ट हो जाता है और अब attacker command string को reference करता है। - Interpreter 1040
Unknown(23)opcodes की tail execute करना शुरू कर देता है। पहला corrupted entry उसकी vtable को offset 0xf000 पर बने forged table से बदल दिया गया है, इसलिएQuramDngOpcode::aboutToApplyfake table सेqpng_read_data(चौथा एंट्री) resolve करता है। - chained gadgets क्रियाएँ करती हैं:
QuramDngImagepointer load करना, raw buffer pointer की ओर point करने के लिए 0x20 जोड़ना, उसे dereference करना, परिणाम कोx19/x0में copy करना, फिर GOT slots के माध्यम से jump करना जिन्हेंsystemपर rewrite किया गया है। क्योंकि raw buffer pointer अब attacker string को पॉइंट कर रहा है, final gadgetsystem(<shell command>)execute कर देता है insidecom.samsung.ipservice।
Allocator Variants पर नोट्स
दो payload families मौजूद हैं: एक jemalloc के लिए tuned, दूसरा scudo के लिए। वे opcode blocks के ordering में अलग होते हैं ताकि adjacency हासिल हो, पर उनके पास वही logical primitives होते हैं (DeltaPerColumn bug ➜ MapTable zero/write ➜ bogus vtable ➜ JOP)। Scudo की disabled quarantine 0x30-byte freelist reuse को deterministic बनाती है, जबकि jemalloc tile/subIFD sizing के माध्यम से size-class control पर निर्भर करता है।
References
Tip
AWS हैकिंग सीखें और अभ्यास करें:
HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें:HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
HackTricks

