driver privilege escalation (CVE-2023-32832)¶
A race condition in MediaTek's
videokernel driver causes memory corruption reachable from an unprivileged context, allowing local escalation of privilege with no additional execution privileges and no user interaction.
Mechanism¶
Bir driver race condition'ı neden bir privilege sınırı kırılmasına dönüşür
Android'de vendor kernel driver'ları ring 0'da çalışır ama /dev altındaki
device node'lar üzerinden sıradan uygulamalara ioctl arayüzleri açar. Eşzamanlı
çağrıcıları serileştirmeden paylaşılan duruma dokunan herhangi bir kod yolu bir
privilege-escalation yüzeyi hâline gelir: attacker hiçbir özel capability tutmaz,
yalnızca device'ı açma ve untrusted-app sandbox'ından eşzamanlı syscall'lar
yayımlama yeteneğine sahiptir.
MediaTek'in Kasım 2023 bülteni CVE-2023-32832'yi birebir şöyle tanımlar:
"In video, there is a possible memory corruption due to a race condition. This could lead to local escalation of privilege with no additional execution privileges needed. User interaction is not needed for exploitation."
Sınıflandırılan zayıflık "concurrent execution using shared resource
with improper synchronization (race condition)"'dır. Doğru bir driver'ın
tutması gereken invariant, bir object'in doğrulanması ile kullanımının
diğer thread'lere göre atomik olmasıdır. Bu sağlanmadığında, aynı ioctl'i
yarışan iki thread bir TOCTOU window'u açar: thread A bir
size/pointer/handle'ı doğrular, thread B arkadaki object'i mutate eder ya
da free eder, ve thread A sonra eskimiş durum üzerinde çalışır — kernel
heap belleğine bir double-free, use-after-free veya out-of-bounds write.
Corruption kernel adres uzayına düştüğü için, bunun kontrollü bir örneği
(kernel allocator'ı groom'layarak free edilmiş/overflow olmuş slot'un
attacker-etkili bir object ile değiştirilmesi) standart Android LPE
primitive'lerini verir: arbitrary kernel read/write, sonra bir cred
struct'ını overwrite etmek ya da SELinux'u etkisizleştirip root almak.
"No additional execution privileges" ifadesi, entry point'in yalnızca
privileged bir servisten değil, app sandbox'ından erişilebilir olduğu
anlamına gelir.
Public detay kasıtlı olarak az
MediaTek'in bültenleri bileşeni, zayıflık sınıfını, severity'yi ve etkilenen chipset'leri açıklar ama suçlu fonksiyonu, struct'ı, race window'unu ya da bir PoC'yi açıklamaz. Yukarıdaki akıl yürütme, bir driver race-condition LPE'sinin standart modeli ve birebir bülten metnidir; herhangi bir patch diff yayımlanana kadar tüm fonksiyon/offset ayrıntılarını doğrulanmamış sayın.
Walkthrough¶
CVE-2023-32832 için public bir PoC yoktur. Aşağıdaki, bir memory-corruption driver race'ini tetiklemenin ve doğrulamanın generic biçimidir — yalnızca yetkili bir test cihazına karşı uyarlayın.
1. Device node'unu ve ioctl'leri belirle. video bileşenine MediaTek
device node'u üzerinden erişilir; vendor driver header'larından ya da
disassembly'den ioctl komutlarını enumerate et ve unprivileged bir process'in
node'u open() edebildiğini doğrula (app domain'i için SELinux
neverallow/allow kurallarını kontrol et):
2. Paylaşılan object üzerinde iki thread'i yarıştır. Bir thread'i
paylaşılan video buffer'ını ya da handle'ını allocate/validate eden ioctl'i
yayımlayacak şekilde döndür, ikinci bir thread'i de onu free eden ya da
resize eden çağrıyı yayımlayacak şekilde, window'u döverek validate-sonra-use
sırasının iç içe geçmesini sağla:
// pseudo-PoC shape (not the real CVE-2023-32832 sequence)
void *racer(void *arg) {
while (running)
ioctl(fd, MTK_VIDEO_FREE_OR_RESIZE, &obj); // mutator
return NULL;
}
int main() {
fd = open("/dev/<mtk-video-node>", O_RDWR);
pthread_create(&t, NULL, racer, NULL);
while (running)
ioctl(fd, MTK_VIDEO_VALIDATE_AND_USE, &req); // victim path
}
3. Corruption'ı doğrula. Bir debug/eng kernel'de KASAN bug sınıfını
doğrudan raporlar; bu CWE için beklenen çıktı video driver'ında bir
use-after-free ya da out-of-bounds erişimdir:
==================================================================
BUG: KASAN: use-after-free in <mtk_video_fn>+0x.../0x...
Read/Write of size N at addr ffffff80.... by task poc/PID
...
Freed by task poc/PID:
kfree+...
<mtk_video_free_fn>+...
==================================================================
4. Corruption'ı LPE'ye çevir. Free edilmiş/overflow olmuş slot'u heap
grooming yoluyla kontrol edilebilir bir kernel object ile reclaim et, bir
kernel read/write primitive'i inşa et, sonra çağıran task'ın cred'ini
overwrite ederek (bkz. ../kernel/cred-struct-overwrite.md ve
../kernel/commit-creds.md) ve SELinux enforcement'ını etkisizleştirerek
escalate et. Race yalnızca başlangıç corruption'ını sağlar; gerisi generic
Android kernel exploitation'ıdır.
Detection¶
- Test build'lerinde KASAN / KFENCE, UAF/OOB'yi trigger zamanında işaretler.
- Production cihazlarda tek sinyal patch level'dır: Kasım 2023 fix'inden önceki bir Security Patch Level'da olan bir cihaz zafiyetlidir.
- EDR/MDM posture kontrolleri: vendor media device node'larına karşı çok
thread'li sıkı
ioctldöngüleri başlatan uygulamalar için alarm üret.
Mitigation¶
- MediaTek Kasım 2023 patch'ini (ya da Android Security Patch Level >= 2023-11 olan herhangi birini) uygulayın. Bültene göre etkilenen chipset'ler: MT6883, MT6885, MT6889, MT6893, MT6895, MT6983, MT6985, MT8797, MT8798; Android 12.0 ve 13.0 üzerinde.
- SELinux policy'sini sıkılaştırın ki untrusted app domain'leri vendor media device node'larını doğrudan açamasın.
- Heap-grooming istismarını köreltıcı genel hardening: hardened usercopy, slab freelist randomizasyonu/hardening ve CONFIG_INIT_ON_FREE.