Skip to content

Fall of the machines: Exploiting the Qualcomm NPU kernel driver

Qualcomm msm_npu Neural 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.

  1. Bir kernel heap adresini ve kernel function adreslerini ifşa etmek için info-leak bug'larını kullan, KASLR'ı kır.
  2. Leak edilen object'i free et, sonra memory'sini attacker-controlled içerikle reclaim et (örn. doğru boyutta bir sendmsg heap spray'i ile).
  3. npu_client üzerinde use-after-free'yi tetiklemek için close-vs-async-completion race'ini kazan.
  4. Dangling reference artık kötü niyetli bir wait-queue / function pointer içeren forge edilmiş bir client object'ine işaret eder.
  5. Forge edilmiş object'i bir kernel gadget üzerinden sürerek kontrollü kod yürütmeye pivot yap (örn. eBPF interpreter yürütmesine).
  6. 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_enforcing için __kdp_ro read-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).

References