Skip to content

Mali Utgard rooting (legacy forever-day)

Ucuz, uzun ömürlü Android cihazlar hâlâ legacy Arm Mali Utgard (Mali-400/450) GPU driver'ıyla geliyor; bu driver'ın "forever-day" GPU memory-management bug'ları, unprivileged bir app'in kernel page'lerini GPU'ya map'lemesine ve bir Pixel-Processor write job'ı (ya da free edilmiş mali_alloc/ion_buffer object'leri üzerinde bir UAF) kullanarak kernel memory'yi corrupt edip root almasına izin veriyor.

Mechanism

Yapmaması gereken physical memory'ye yazmaya ikna edilebilen bir legacy GPU

"Utgard", Arm'ın birinci nesil Mali mimarisidir (Mali-400 MP, Mali-450 MP4); hâlâ budget SoC'lerde (örn. MediaTek MT6580/MT6582/MT8127, HiSilicon Kirin 620, Samsung Exynos 3470) ve artık güncelleme almayan Android 4.4–8.1 dönemi cihazlarda bulunuyor. Kernel driver'ı, modern GPU-driver hardening'inden daha eski.

Public Mali Utgard rooting araştırması (RIPMaliUtgard / DistrictCon "Junkyard" çalışması) iki sınıf GPU memory-management flaw'una odaklanıyor:

  1. GPU'ya arbitrary physical-memory mapping. Proprietary driver varyantında, unprivileged bir process driver'ı arbitrary physical page'leri — kernel page'leri dahil — GPU address space'ine map'lemeye zorlayabilir, ardından tek amacı bu map'lenmiş memory'ye yazmak olan bir Pixel Processor (PP) job issue edebilir. Kırılan invariant en temel olanıdır: untrusted bir app'ten gelen bir GPU job, app'in legitimate şekilde sahip olduğu buffer'ların dışındaki physical memory'yi asla adresleyememeli. Kernel page'ler GPU-map'lenmişken ve bir PP write primitive ile attacker kernel function pointer'larını / data'sını overwrite eder.

  2. Open-source driver'da use-after-free. Open-source varyantlarda, free edilmiş mali_alloc GPU allocation object'leri (ve ilişkili ion_buffer yapıları) yeniden kullanılır; bu da free edilen object'i attacker-controlled data ile replace ederek groom edilen bir UAF verir — bir GPU allocation slab'ine klasik spray-and-replace — ve controlled bir pointer forge etmeyi sağlar.

Her iki yol da aynı sonuçta birleşir: kernel memory'nin data-only bir corruption'ı (file_operations tarzı handler pointer'ları, credential'lar ya da SELinux state'i overwrite ederek) ki bu root'a escalate olur; JOP/ROP chain'leri yalnızca bir PXN/SELinux barrier'ının etrafından dolaşılması gereken yerlerde devreye girer. Write GPU üzerinden (ya da forge edilmiş bir object aracılığıyla) gerçekleştiği için, klasik bir stack/heap overflow gerekmez.

CVE-ID uyarısı — cite etmeden önce verify et

Public Mali Utgard rooting araştırması (RIPMaliUtgard, DistrictCon'da sunuldu) bunları "forever-day" bug'lar olarak tanımlıyor ve kendisi bir CVE atamıyor. Bağımsız olarak, NVD/CVE.org'daki otoriter CVE-2025-25180 kaydı Imagination Technologies Graphics DDK (PowerVR)'a karşılık geliyor — "non-privileged ... improper GPU system calls to subvert GPU HW to write to arbitrary physical memory pages" (CWE-823, Use of Out-of-range Pointer Offset) — Arm Mali Utgard'a değil. Tam CVE-2025-25180 ⇄ Mali Utgard eşleşmesini unconfirmed olarak değerlendir: teknik (arbitrary physical page'lere yazan untrusted bir GPU job → root) gerçek ve her iki vendor'da da ruh olarak aynı, ancak CVE identifier'ı ve Mali-Utgard etiketi farklı kaynaklardan geliyor. Bu not bu nedenle unverified olarak işaretlenmiştir.

Walkthrough

Her iki primitive de cihaza push edilen unprivileged bir Android binary'sinden erişilebilir (GPU device-node erişimi dışında özel bir permission gerekmez).

# Cross-compile with the Android NDK and deploy to a test device you own.
$ aarch64-linux-android-clang root_utgard.c -o root_utgard      # 64-bit (e.g. Kirin 620)
# or armv7a-linux-androideabi-clang ...                          # 32-bit (MT6580 etc.)
$ adb push root_utgard /data/local/tmp/
$ adb shell /data/local/tmp/root_utgard
Kavramsal akış: arbitrary GPU mapping + PP write (proprietary driver)
1. open the Mali Utgard device node and set up a GPU memory session.
2. Abuse the buggy memory-mapping ioctl path to map a *kernel* physical
   page into the GPU's address space (the driver fails to validate the
   physical range against what the caller owns).
3. Submit a Pixel Processor (PP) job configured to WRITE a chosen value to
   the GPU virtual address that now aliases the kernel page.
4. Target a kernel function-pointer table (e.g. an fops handler) or the
   caller's cred struct; trigger the overwritten path to run controlled
   code or flip uid/SELinux -> root.
Kavramsal akış: mali_alloc / ion_buffer UAF (open-source driver)
1. Allocate then free a GPU allocation so a mali_alloc / ion_buffer object
   is released back to its slab.
2. Spray replacement objects (e.g. via add_key payloads) to refill the
   freed slot with attacker-controlled bytes -> dangling pointer now points
   at controlled data.
3. Use the forged object to obtain a controlled write, then pivot through a
   JOP chain to bypass PXN/SELinux on hardened kernels -> root.

Yalnızca yetkili target'lar

Bunlar piyasadaki consumer cihazlar için gerçek rooting exploit'leri. Onları yalnızca sahibi olduğun ya da test etmek için açıkça yetkilendirildiğin donanım üzerinde çalıştır. Etkilenen birçok cihaz end-of-life durumunda ve asla patch'lenmeyecek.

Detection

  • Etkilenen yüzey. Hâlâ Mali Utgard (Mali-400 / Mali-450) kernel driver'ı ile gelen herhangi bir cihaz — ağırlıklı olarak MT6580/MT6582/MT8127, Kirin 620, Exynos 3470 üzerinde EOL budget Android (4.4–8.1).
  • Davranışsal. Mali Utgard device node'unu açan ve sahip olmadığı physical range'lere referans veren memory-mapping ioctl'leri issue eden unprivileged bir binary, ya da GPU buffer'larının hızlı alloc/free churn'ünü takip eden add_key/keyring spray'leri (slab-refill grooming), imzadır.

Mitigation

  • Vendor driver update tek gerçek çözümdür; EOL Utgard cihazlar için bu genellikle mevcut değildir, dolayısıyla pratik mitigation cihazı hassas workload'lar için kullanmayı bırakmak ya da app kurulumunu kısıtlamaktır.
  • İzin veren platformlarda defense in depth: untrusted app domain'lerinden GPU device-node erişimini reddet ve her GPU physical-mapping isteğini caller'ın sahip olduğu buffer'lara karşı validate et (kernel/non-owned physical range'leri reddet).

References