Fall of the machines: Exploiting the Qualcomm NPU kernel driver¶
Qualcomm
msm_npuNeural Processing Unit kernel driver'ında üç bug'lık bir chain — bir use-after-free artı iki info leak — bir Android root exploit'ine dönüştürüldü.
Mechanism¶
Kırılan invariant
Qualcomm msm_npu (NPU) kernel driver'ındaki üç bug zincirlenir.
CVE-2021-1940 bir use-after-free'dir: NPU coprocessor'ında çalışan async
npu_exec_network work'ü ile file-handle close arasındaki bir race, npu_client
object'inin hâlâ referenced'ken free edilmesine izin verir.
CVE-2021-1968 bir out-of-bounds-read info leak'idir (bir stats/event
copy_to_user'ında yanlış bir source pointer), ve CVE-2021-1969 bir uninitialized
kernel-stack info leak'idir (npu_kevent'te uninitialized union/reserved field'lar).
Leak'ler KASLR'ı kırar ve UAF, reuse'unu attacker'ın dikte ettiği kontrol edilebilir freed
bir object sağlar — app-sandbox→kernel sınırını geçerek.
Kavramsal race-window timeline (CVE-2021-1940) — iki thread bir npu_client
object'ine erişir; close yolu free ederken async work hâlâ onu referenced tutar:
close(fd) thread async npu_exec_network work
---------------- ---------------------------
... close başlar
npu_client'i free et ──────► (work hâlâ object'e ref tutuyor)
freed npu_client'i dereference
◄────── = use-after-free penceresi
(slot artık reclaim'e açık)
Attacker bu pencerede free edilmiş slot'u kontrollü içerikle reclaim eder;
async yol sonra forge edilmiş object'i okur. Sıralama scheduler'a göre
yarışır — bu yüzden race tekrar tekrar denenir.
Walkthrough¶
GitHub Security Lab writeup'ından alınmış kavramsal tekrar.
- Bir kernel heap adresini ve kernel function adreslerini ifşa etmek için info-leak bug'larını kullan, KASLR'ı kır.
- Leak edilen object'i free et, sonra memory'sini attacker-controlled içerikle reclaim et
(örn. doğru boyutta bir
sendmsgheap spray'i ile). npu_clientüzerinde use-after-free'yi tetiklemek için close-vs-async-completion race'ini kazan.- Dangling reference artık kötü niyetli bir wait-queue / function pointer içeren forge edilmiş bir client object'ine işaret eder.
- Forge edilmiş object'i bir kernel gadget üzerinden sürerek kontrollü kod yürütmeye pivot yap (örn. eBPF interpreter yürütmesine).
- Kernel yürütmesiyle SELinux enforcing flag'ini çevir ve bir root shell spawn et.
Detection¶
- Güvenilmeyen uygulamaların
/dev/msm_npu'yu açıp network exec/unload dizileri göndermesi. - Tek bir sandbox'lı UID'den yüksek-oranlı ya da racing file-close vs.
npu_exec_networkçağrıları (race-trigger pattern'i). - NPU object free'lerine bitişik büyük
sendmsg/ heap-spray patlamaları. - SELinux'un permissive'e düşmesi, ya da bir uygulama context'inden
call_usermodehelper-spawn'lı shell'ler. - Instrumented build'lerde NPU driver fault'ları / KASAN tarzı UAF anomalileri gösteren kernel log'ları.
Mitigation¶
- Qualcomm / Samsung firmware fix'lerini uygula (UAF ~Temmuz 2021'de düzeltildi; info leak'ler ~Ekim 2021'de düzeltildi).
- Etkilenen Samsung cihazlarında vendor
selinux_enforcingiçin__kdp_roread-only koruması ekledi — firmware'i güncel tut. - NPU device-node erişimini güvenilmeyen app domain'inden SELinux policy ile kısıtla.
- Reclaim'i ve uninitialized-memory leak'lerini köreltmek için heap hardening / freelist randomization ve zero-on-alloc uygula.
- KASLR'ı artı structure-layout hijyenini koru (userspace'e uninitialized padding kopyalanmaz).