Skip to content

TEEzz: Fuzzing Trusted Applications on COTS Android Devices

Stok Android telefonlarda gerçek trusted application'ları in situ süren TEE-aware bir black-box fuzzer — naive fuzzing'in ulaşamadığı fault'lara ulaşmak için type-aware mutation, state-aware interaction sequence'leri, dependency resolution ve state reset kullanır.

Mechanism

Sınır neden kırılıyor

Bir ARM TrustZone telefonunda, trusted application'lar (TAs) secure-world TEE içinde çalışır, normal-world Rich Execution Environment'tan (REE) izole edilmiştir. REE bir TA ile yalnızca GlobalPlatform tarzı client interface'i (world boundary'si boyunca marshal edilen session'lar ve Invoke command'ları) üzerinden konuşur. O interface, TEEzz'in hedeflediği attack surface'idir: untrusted REE input'unu işleyen bir TA — DRM, keystore, biometrics — herhangi bir normal-world app'inden ya da compromise olmuş process'ten erişilebilir, yine de hassas secret'lar üzerinde yüksek privilege'de çalışır. Bu yüzden bir TA'daki bir memory-corruption ya da logic bug, REE→TEE trust boundary'sini ihlal edebilir.

Bu surface'i bir commodity (COTS) cihazda fuzz'lamak üç yapısal nedenden zordur ve her biri gerçek bir saldırgan için geçerli olmayan bir varsayıma karşılık gelir. TA encrypted ve opaktır (coverage yok, kaynak yok); command/parameter format'ları proprietary'dir; ve input'ları value-dependent'tir — bir çağrının döndürdüğü bir buffer ya da handle, bir sonraki tarafından gereklidir. Flat, stateless fuzzing TA'nın beklentilerinin hiçbirini ihlal etmez ve dolayısıyla anında reddedilir. TEEzz bunun yerine kaydedilmiş interaction sequence'inin kendisini fuzzing birimi olarak ele alır, böylece tam olarak kararlı bir saldırganın yapacağı gibi mutate ederken yapıyı koruyabilir. Emulation-tabanlı bir muadil için bkz. the-road-to-qualcomm-trustzone-apps-fuzzing.md ve TA bug'larının nereye götürdüğü için bkz. trust-issues-exploiting-trustzone-tees.md.

Walkthrough

Public IEEE S&P 2023 paper'ından (Busch, Machiry, Spensky, Vigna, Kruegel, Payer) yüksek seviyeli yeniden inşa; yalnızca kavramlar.

  1. Gerçek interaction'ları kaydet. TEEzz, meşru REE↔TA değişimlerini (bir normal-world app'inin yaptığı client-API çağrıları) gözlemler ve bütün interaction sequence'lerini seed olarak yakalar — TA'nın iç yapısına asla ihtiyaç duymaz.
  2. Type-aware mutation. Genişletilebilir, type-aware bir engine, command parametrelerinin kaba yapısını çıkarsar ki mutation'lar ilk format check'inde düşürülmek yerine kabul edilecek kadar well-formed kalsın.
  3. State-aware fuzzing. TA'lar stateful olduğu için, fuzzer tek mesajlar yerine bütün sequence'ler üzerinde akıl yürütür ve value-dependency'leri runtime'da çözer — daha önceki bir çağrının ürettiği bir handle ya da buffer'ı daha sonraki birine besler ki derin TA state'lerine gerçekten ulaşılsın.
  4. Reproducibility için state reset. Deterministik state-reset mekanizmaları, bir TA'nın state'ini sıfırdan yeniden inşa eder, böylece sequence ortasında bulunan bir crash, nondeterminism'e kaybedilmek yerine güvenilir biçimde reprodüksiyon edilebilir.
Sequence'ler tek mesajları neden yener

Tek bir mutate edilmiş Invoke nadiren ilginç koda ulaşır:

open_session(ta)        -> sess
cmd_init(sess, cfg)     -> ctx        # establishes TA state
cmd_process(ctx, BLOB)               # the call actually fuzzed

Prefix'i replay ederken yalnızca BLOB'u mutate etmek sess/ctx'i geçerli tutar, bu da fuzzer'ı TA'nın erken validation'ının ötesine taşıyan şeydir.

Bulgular, kavramsal olarak

Production Android cihazlarında gerçek TA'lara karşı değerlendirilen TEEzz, shipping trusted application'larda önceden bilinmeyen crash'leri ve logic error'larını yüzeye çıkardı ve in-situ, state-aware yaklaşımın structure-blind fuzzing'in kaçırdığı bug'ları bulduğunu gösterdi. Paper bunları kasıtlı olarak exploit olarak değil, bir araştırma irtifasında bildirir.

Detection

  • TA / TEE crash log'ları: Bir normal-world client'ın kaydedilmiş bir sequence'i replay etmesiyle ilişkilendirilmiş, spesifik bir TA'ya atfedilen secure-world abort'ları çekirdek sinyaldir; framework reprodüksiyon eden interaction sequence'ini yayar.
  • Malformed ya da out-of-order command'lar: Stale session/handle değerlerini yeniden kullanan ya da malformed parametreler taşıyan client-API trafiği, bir TEE-side monitor'a ya da instrumented bir client driver'a gözlemlenebilir.
  • State-reset pattern'leri: Bir TA'nın session state'inin tekrarlı deterministik teardown/rebuild'i, başlı başına fuzzing kampanyaları için anormal bir usage fingerprint'idir.

Mitigation

  • TA boundary'sinde valide et: TA geliştiricileri, REE tarafından sağlanan her parametreyi — length'ler, pointer'lar, session/handle geçerliliği ve command ordering — titizlikle kontrol etmeli ve malformed input'ta fail closed olmalı.
  • Robust TA state machine'leri: TA state transition'larını açık yap ve out-of-sequence command'ları reddet ki dependency-replay saldırıları TA'yı beklenmeyen state'lere süremesin.
  • Vendor patching: Açıklanan sorunlar için OEM/TEE-vendor TA update'lerini uygula; TA'lar imzalı ve merkezi olarak dağıtıldığı için, fix'ler vendor secure-world update'leri yoluyla yayılır.
  • Fuzzing'i sola kaydır: Release'ten önce vendor CI'sinde TA'lara karşı TEE-aware, state-aware fuzzing çalıştır, ideal olarak production saldırganlarının sahip olmadığı kaynak/coverage ile — defender için bir black-box avını bir white-box ava çevirerek.

References