Skip to content

Pwn2Own Qualcomm compute DSP (cDSP) Hexagon exploitation

Auto-generated Hexagon SDK stub/skel marshalling kodu signed length check'leri kullandığından, compute DSP'ye FastRPC üzerinden ulaşan unprivileged bir Android app, heap overflow tetiklemek ve Hexagon cDSP üzerinde unsigned kod çalıştırmak için negative length'ler geçirebilir.

Mechanism

Signed-length confusion across the FastRPC boundary

Compute DSP (cDSP), Snapdragon SoC'lerde compute-heavy task'lar (vision, NN, camera) için signed kod çalıştıran bir Hexagon-architecture subsystem'idir. Android onunla FastRPC üzerinden konuşur: bir app, bir libXXX_stub.so çağırır; bunun marshalled remote_arg array'i /dev/cdsprpc-smd üzerinden DSP'deki bir libXXX_skel.so'ya geçer ve orada unmarshal edilip dispatch edilir.

Hexagon SDK bu stub/skel kodunu auto-generate eder ve üretilen bounds check'ler signed integer'ları karşılaştırır. Attacker stub'ı bypass eder ve bir remote_arg entry'sine doğrudan negative bir length yazar; skel'in signed int boundary check'i geçer (negative < limit), ama sonraki copy length'i büyük bir unsigned size olarak ele alır — DSP üzerinde bir heap overflow. İki birikimli zayıflık platform boundary'sini kırar:

  • Caller'lar için gerçek bir code-signing gate yok: herhangi bir app Qualcomm-signed bir skel'i asset'lerinde gönderebilir, onu extract edebilir ve bir session açabilir — ve Snapdragon 855/865 cDSP üzerinde signature-free shared object'lere izin verir.
  • Downgrade: ADSP_LIBRARY_PATH'in başına path eklemek daha eski, vulnerable skel sürümlerini yükler ve patch'leri geri alır.

Kırılan invariant: "DSP üzerinde yalnızca signed, validate edilmiş kod ve input'lar çalışır." Bunu yenmek, DSP guest OS'in içinde kod yürütme sağlar — ayrı, trusted bir security domain'i — QDI kernel driver'larından erişilebilir ve camera/sensor stream'lerini intercept edebilir.

Disclosed CVE'ler: CVE-2020-11201, CVE-2020-11202, CVE-2020-11206, CVE-2020-11207, CVE-2020-11208, CVE-2020-11209 (Check Point, DEF CON 28'de sunuldu, 2020).

Walkthrough

Bu, public Check Point writeup'ından defansif olarak belgelenmiştir; chain burada weaponized bir end-to-end olarak reprodüksiyonu yapılmamıştır.

Conceptual path (per the public research):
1. Android app bundles a Qualcomm-signed *_skel.so and extracts it locally.
2. App opens a FastRPC session to cDSP (libadsprpc.so / /dev/cdsprpc-smd).
3. Optionally set ADSP_LIBRARY_PATH to load an older vulnerable skel (downgrade).
4. Invoke a skel method with a remote_arg length set negative, bypassing the
   signed-int bounds check -> heap overflow on the DSP -> unsigned DSP code exec.

Temsili bug class (advisory'den): string/buffer marshalling, length'i bounds check'ten önce signed int'e cast eder, böylece negative bir değer validation'dan geçer ve sonra overflow eder. Beklenen sonuç: hardened bir build'de crash; vulnerable bir build'de kontrollü DSP-side memory corruption.

Detection

  • On-device: ADSP_LIBRARY_PATH'e yazan ya da *_skel.so binary'lerini app-private dizinlere extract eden app'ler anormaldir.
  • FastRPC client'larından gelen DSP subsystem crash/restart (SSR) log'ları fuzzing ya da exploitation girişimlerine işaret eder.

Mitigation

  • Qualcomm'un Kasım 2020 security bulletin patch'lerini uygulayın (altı CVE).
  • Skel signing/allow-listing'i zorunlu kılın ve etkilenen SoC'lerde unsigned-DSO ve ADSP_LIBRARY_PATH downgrade path'lerini kaldırın.
  • DSP'yi untrusted bir peer olarak ele alın: tüm FastRPC argümanlarını unsigned semantikle validate edin/bound'layın.

References