TrustZone Kernel Privilege Escalation (CVE-2016-2431)¶
Unvalidated syscall pointer'ları üzerinden compromise olmuş bir QSEE trustlet'inden (CVE-2015-6639) Qualcomm TrustZone secure-world kernel'ine (CVE-2016-2431) yükselen iki aşamalı bir Android chain.
Mechanism¶
Bug class / invariant
Qualcomm'un secure world'ü iki privilege katmanına sahiptir: QSEE trustlet'leri (secure userspace) ve TrustZone kernel'i (secure supervisor). Invariant şudur: bir trustlet — compromise olmuş olsa bile — tüm secure world için physical memory'yi, fuse'ları ve hardware protection'larını aracılayan TZ kernel'ini subvert edememelidir.
CVE-2015-6639, normal→secure sınırını kırar: Widevine DRM trustlet'i,
attacker-supplied bir length kullanarak command buffer'dan global bir buffer'a
unchecked bir memcpy yapar; bu secure-world state'i corrupt eder ve QSEE içinde
code execution verir.
CVE-2016-2431 ardından trustlet→TZ-kernel sınırını kırar: TZ kernel'i,
cipher-parameter syscall'larında (qsee_cipher_get_param / qsee_cipher_set_param)
user-supplied pointer'ları yetersizce validate eder. Bir attacker pointer'ını trusted
bir kernel pointer'ı gibi ele almak, syscall'ı secure kernel'de keyfi bir read/write
primitive'ine çevirir.
Kavramsal tema bir confused-deputy chain'idir: eksik bir length check (overflow) attacker'ı QSEE'ye sokar ve eksik bir pointer-provenance check'i (CWE-20-style validation gap) o QSEE foothold'unun TZ-kernel memory'sini yeniden yazmasına izin verir.
Walkthrough¶
Yalnızca kavramsal
Gal Beniamini'nin public "Bits, Please!" writeup'larından high-level model. Hiçbir exploit code, offset ya da gadget chain yeniden üretilmiyor.
- QSEE'ye gir (CVE-2015-6639). Bir normal-world app, QSEECOM üzerinden Widevine
trustlet'ine ulaşır ve fully-controlled
memcpy'yi tetikler; QSEE içinde code execution kazanmak için bir secure-world yapısını corrupt eder. - TZ-kernel syscall'ına ulaş (CVE-2016-2431). QSEE'den attacker, TZ kernel'inin validate edemediği crafted pointer argument'leriyle cipher-parameter syscall'larını çağırır.
- Read/write kur. get/set primitive'lerini zincirlemek keyfi secure-kernel read ve write verir.
- Secure kernel'e pivot et. Kavramsal olarak attacker, executable bir secure page'e code yazar, instruction cache'ini flush eder ve TZ-kernel context'inde çalışmak için memory protection'ları (DACR) gevşetir.
Detection¶
Host / telemetry sinyalleri
- Anormal QSEECOM aktivitesi: Widevine/cipher trustlet interface'lerini olağandışı command buffer'larla çağıran untrusted app'ler.
- Secure-world kararsızlığı: bir app ile korele olan
tz/qseecomkernel-log hataları, TEE reset'leri ya da beklenmedik secure-world fault'ları. - Fleet attestation: Mayıs 2016 patch level'ının altında çalışan cihazları ya da version'ı fix'ten önce gelen trustlet'leri (rollback abuse) tespit et.
Mitigation¶
Patch & hardening
- Android Mayıs 2016 security bulletin'ini uygula (ve güncel tut); birincil fix budur.
- TEE'de pointer provenance'ını validate et. Secure-kernel syscall'ları, dereference etmeden önce user-supplied pointer'ların caller-owned memory'ye işaret ettiğini doğrulamalıdır.
- Anti-rollback'i zorla ki fix'lenmiş bir trustlet vulnerable olanıyla değiştirilemesin — bkz. Trust Issues: Exploiting TrustZone TEEs.
- Secure runtime'ı sertleştir (ASLR, stack cookie, W^X enforcement) ki her iki aşamanın da maliyeti artsın.