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_bufferobject'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:
-
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.
-
Open-source driver'da use-after-free. Open-source varyantlarda, free edilmiş
mali_allocGPU allocation object'leri (ve ilişkiliion_bufferyapı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).