Matumizi Mabaya ya Mitiririko ya Media za Android & Vichambuzi vya Picha

Tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Uwasilishaji: Programu za Ujumbe ➜ MediaStore ➜ Vichambuzi vyenye Ruhusa za Juu

Tengenezo za OEM za kisasa huendesha mara kwa mara media indexers zenye ruhusa ambazo hupitia tena MediaStore kwa ajili ya vipengele vya “AI” au vya kushiriki. Kwenye firmware za Samsung kabla ya patch ya Aprili 2025, com.samsung.ipservice inaanzisha Quram (/system/lib64/libimagecodec.quram.so) na huichambua moja kwa moja faili yoyote ambayo WhatsApp (au programu nyingine) inaweka ndani ya MediaStore. Kwa vitendo mshambuliaji anaweza kutuma DNG iliyofichwa kama IMG-*.jpg, kusubiri mwenye kuathirika kubonyeza “download” (bonyeza moja), na huduma yenye ruhusa itachambua payload hiyo hata ikiwa mtumiaji hajawahi kufungua galeri.

$ 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], ...

Vidokezo muhimu

  • Usambazaji unategemea upya-uchambuzi wa media ya mfumo (si mteja wa chat) na hivyo unatambua ruhusa za mchakato huo (ufikiaji wa kusoma/kuandika kikamilifu kwa galeri, uwezo wa kuangusha media mpya, n.k.).
  • Kila image parser inayofikika kupitia MediaStore (vision widgets, wallpapers, AI résumé features, n.k.) inakuwa inafikika kwa mbali ikiwa mshambulizi anaweza kumshawishi lengo kuhifadhi media.

Hitilafu za Interpreter ya Opcode ya Quram DNG

DNG files zinaweka orodha tatu za opcode zinazotumika katika hatua tofauti za decode. Quram inakopia API ya Adobe, lakini handler yake ya Stage-3 kwa DeltaPerColumn (opcode ID 11) inamwamini mshambulizi kuhusu mipaka ya plane.

Mipaka ya plane yasiyofaa katika DeltaPerColumn

  • Washambulizi wanaweka plane=5125 na planes=5123 ingawa picha za Stage-3 zinaonyesha tu plane 0–2 (RGB).
  • Quram hubadilisha opcode_last_plane = image_planes + opcode_planes badala ya plane + count, na kamwe haishtaki kama safu ya plane iliyopatikana inafaa ndani ya picha.
  • Kwa hivyo loop inaandika delta kwenye raw_pixel_buffer[plane_index] kwa offset ambayo mshambulizi anaweza kudhibiti kabisa (mfano, plane 5125 ⇒ offset 5125 * 2 bytes/pixel = 0x2800). Kila opcode inaongeza thamani ya 16-bit float (0x6666) kwenye eneo lengwa, ikitoa primitive ya kuongeza OOB kwenye heap yenye usahihi.

Kugeuza ongezeko kuwa uandishi wa hiari

  • Exploit kwanza inaharibu Stage-3 QuramDngImage.bottom/right kwa kutumia operesheni 480 za DeltaPerColumn zilizoathirika ili opcodes za baadaye zikaone kuratibu kubwa kama ziko ndani ya mipaka.
  • MapTable opcodes (opcode 7) kisha zimeelekezwa kwenye mipaka feki hiyo. Kwa kutumia jedwali la uingizaji lenye namba zote sifuri au DeltaPerColumn yenye deltas -Inf, mshambulizi anafanya sifuri eneo lolote, kisha anatumia deltas za ziada kuandika thamani sahihi.
  • Kwa sababu vigezo vya opcode viko ndani ya metadata ya DNG, payload inaweza kuandika mamia ya maelfu ya uandishi bila kugusa kumbukumbu ya mchakato moja kwa moja.

Kuunda heap chini ya Scudo

Scudo huweka allocations kwa makundi kwa ukubwa. Quram kwa bahati nzuri inateua vitu vifuatavyo zikiwa na ukubwa sawa wa vipande vya 0x30-byte, kwa hivyo vinakaa katika eneo hilo hilo (pengo la 0x40-byte kwenye heap):

  • QuramDngImage descriptors for Stage 1/2/3
  • QuramDngOpcodeTrimBounds and vendor Unknown opcodes (ID ≥14, including ID 23)

Exploit inapanga allocations ili kuweka vipande kwa ufanisi:

  1. Stage-1 Unknown(23) opcodes (20,000 entries) zinaspray vipande vya 0x30 ambavyo baadaye vinafungwa.
  2. Stage-2 inaweka huru opcodes hizo na kuweka QuramDngImage mpya ndani ya eneo lililofunguliwa.
  3. Entries 240 za Stage-2 Unknown(23) zinafungwa, na Stage-3 mara moja inateua QuramDngImage yake pamoja na raw pixel buffer mpya ya ukubwa sawa, ikitumia nafasi hizo.
  4. Opcode iliyoundwa TrimBounds inaendesha kwanza katika orodha 3 na inateua raw pixel buffer nyingine kabla ya kufungua hali ya Stage-2, kuhakikisha karibu “raw pixel buffer ➜ QuramDngImage”.
  5. Entries 640 za ziada za TrimBounds zimewekwa minVersion=1.4.0.1 hivyo dispatcher inaziruka, lakini vitu vinavyoweka nyuma yao vinabaki vimetekwa na baadaye vinakuwa malengo ya primitive.

Mchakato huu unaweka raw buffer ya Stage-3 mara moja kabla ya Stage-3 QuramDngImage, hivyo overflow inayotokana na plane inageuza nyanja ndani ya descriptor badala ya kusababisha crash ya hali nasibu.

Kutumia tena Vendor “Unknown” Opcodes kama Data Blobs

Samsung inaacha high bit iliyowekwa katika vendor-specific opcode IDs (kwa mfano, ID 23), ambayo inamwambia interpreter ili allocate muundo lakini kuruka utekelezaji. Exploit inatumia vitu hivyo vilivyo lala kama heaps zinazoendeshwa na mshambulizi:

  • Opcode list 1 na 2 Unknown(23) entries hutumika kama scratchpads zinazoendelea kuhifadhi bait za payload (JOP chain at offset 0xf000 na shell command at 0x10000 relative to the raw buffer).
  • Kwa sababu interpreter bado inawatendea kila kitu kama opcode wakati list 3 inaposindika, kumiliki vtable ya kitu kimoja baadaye inatosha kuanza kutekeleza data za mshambulizi.

Kutengeneza MapTable Bandia & Kupitia ASLR

MapTable objects ni kubwa kuliko TrimBounds, lakini mara mpangilio ukozeaji unapoingia, parser inasoma kwa furaha vigezo ziada nje ya mipaka:

  1. Tumia linear write primitive kuharibu sehemu ya pointer ya vtable ya TrimBounds na jedwali la uingizaji la MapTable lililotengenezwa ambalo linachora byte 2 za chini kutoka vtable ya TrimBounds jirani kwenda vtable ya MapTable. Bytes za chini pekee zinatofautiana kati ya builds za Quram zinazotumika, hivyo jedwali moja la 64K linaweza kushughulikia matoleo saba ya firmware na kila slide ya ASLR ya 4 KB.
  2. Rekebisha mabaki ya nyanja za TrimBounds (top/left/width/planes) ili kitu kijae kama MapTable halali wakati kitatumika baadaye.
  3. Endesha opcode bandia juu ya kumbukumbu iliyofanywa sifuri. Kwa sababu pointer ya jedwali la uingizaji kwa kweli inarejelea vtable ya opcode nyingine, bait za pato zinakuwa leaked anuani za kiwango cha chini kutoka libimagecodec.quram.so au GOT yake.
  4. Tumia mapass ya ziada ya MapTable kubadilisha leaks hizo za vitengo viwili kuwa offsets kuelekea gadgets kama __ink_jpeg_enc_process_image+64, QURAMWINK_Read_IO2+124, qpng_check_IHDR+624, na libc’s __system_property_get entry. Washambulizi kwa ufanisi wanajenga tena anwani kamili ndani ya eneo lao la opcode bila APIs za native memory disclosure.

Kuzindua mabadiliko ya JOP ➜ system()

Mara gadget pointers na shell command vinapowekwa ndani ya spray ya opcode:

  1. Wimbi la mwisho la uandishi la DeltaPerColumn linaongeza 0x0100 kwa offset 0x22 ya Stage-3 QuramDngImage, likisogeza pointer ya raw buffer kwa 0x10000 hivyo sasa inarejelea kamba ya amri ya mshambulizi.
  2. Interpreter inaanza kutekeleza mwisho wa Unknown(23) opcodes 1040. Entry iliyoharibika ya kwanza ina vtable yake iliyobadilishwa na jedwali bandia kwenye offset 0xf000, hivyo QuramDngOpcode::aboutToApply inaleta qpng_read_data (ingizo la 4) kutoka kwenye jedwali bandia.
  3. Gadgets zilizokatika hufanya: kupakia pointer ya QuramDngImage, kuongeza 0x20 ili kuonyesha pointer ya raw buffer, kui-referenzisha, kunakili matokeo ndani ya x19/x0, kisha kuruka kupitia GOT slots zilizorekebishwa kwenda system. Kwa kuwa pointer ya raw buffer sasa ni sawa na kamba ya mshambulizi, gadget ya mwisho inatekeleza system(<shell command>) ndani ya com.samsung.ipservice.

Vidokezo kuhusu Aina za Allocator

Kuna familia mbili za payload: moja imeandaliwa kwa jemalloc, nyingine kwa scudo. Zinatofautiana katika jinsi blocks za opcode zinaporatibiwa ili kupatikana ukaribu lakini zinashiriki primitives zile zile za mantiki (DeltaPerColumn bug ➜ MapTable zero/write ➜ bogus vtable ➜ JOP). Quarantine iliyozimwa ya Scudo inafanya matumizi ya freelist ya 0x30-byte kuwa deterministic, wakati jemalloc inategemea udhibiti wa size-class kupitia sizing ya tile/subIFD.

Marejeleo

Tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks