Skip to content

Full Chain Baseband Exploits: MediaTek baseband-to-kernel pivot CVE-2022-21765

TASZK Labs'in ele geçirilmiş bir MediaTek modemden Android Linux kernel'ine yaptığı pivot (CVE-2022-21765): CCCI AP/CP shared-memory ringbuffer'ı, baseband tarafından yazılan offset ve length değerlerine güvenir; bu da kernel'de bir OOB read/write üretir ve bu primitive kernel code execution'a yükseltilir.

Mechanism

Note

MediaTek SoC'lerde application processor (AP) ile cellular processor (CP / baseband), Linux kernel'indeki CCCI driver üzerinden, bir dizi ringbuffer barındıran shared memory aracılığıyla haberleşir. Burada kırılan güvenlik sınırı AP↔CP isolation'dır: kernel'in modeme güvenilmeyen bir taraf gibi davranması beklenir, ama CCCI ringbuffer kodu o shared memory içinde saklanan offset ve length değerlerine güvenir — bu değerleri, baseband'i zaten kontrol eden bir saldırgan (örneğin CVE-2022-21744 üzerinden) sahteleyebilir.

Ringbuffer read/write mantığı bu offset ve length'leri shared buffer'ı indekslemek için kullanmadan önce doğrulamadığından, kötü niyetli bir modem kernel'de bir out-of-bounds read/write elde eder. Primitive sınırlıdır: bozulma sınırın en fazla ~2*UINT_MAX dışına ulaşabilir ve bozulan şey offset'ler olduğu için saldırgan, OOB read'in nereye düşeceğini ya da OOB write'ın ne yazacağını doğrudan kontrol edemez. Ringbuffer'lar ioremap() ile map'lendiğinden OOB bölgesi kernel'in vmalloc alanında yaşar — bu da yakındaki allocation'ları (thread stack'leri, BPF program'ları) uygulanabilir bozulma hedefi yapan şeydir. Buna çok yakın bir kardeş bug, CVE-2022-21769, aynı sınıftan bir primitive sağlar.

Walkthrough

Bu, yalnızca herkese açık TASZK "Full Chain Baseband Exploits, Part 3" yazısına ve patch'lenmiş MediaTek materyaline dayanan, açıklayıcı ve kavramsal bir reprodüksiyon yoludur. Tekniği Dimensity (64-bit kernel) ve Helio (32-bit kernel) aileleri üzerinde anlatır.

Primitive'i RemoteFS ile keskinleştirmek. AP/CP birçok ringbuffer kullanır, ama çoğu "gürültülü"dür (sürekli kullanımda), bu da onları güvenilir biçimde bozmayı zorlaştırır. Araştırma, yalnızca Remote Filesystem (RemoteFS) implementasyonu tarafından kullanılan ringbuffer'ın boot'tan kısa süre sonra sustuğunu buldu. Sonrasında RemoteFS'in kendi File Write / File Read API'leri, zayıf OOB primitive'lerini neredeyse arbitrary read/write'a dönüştürmek için kullanılır:

Turning weak OOB into write-what-where (conceptual, from Part 3)
  • Yazmak için: normal RemoteFS File Write API'siyle kontrollü byte'ları hazırla, sonra bozulmuş ringbuffer offset'i write'ı yönlendirirken bunları File Read ile "geri" oku — bu bir write-what-where üretir.
  • Okumak için: bir File Write sırasında ringbuffer'ı boz; böylece istenen kernel belleği bir dosyaya yakalanır, sonra bunu File Read ile geri oku.
  • Uyarı: her ringbuffer transferi bir header ve footer taşır; bu yüzden yazılan değerler tamamen kontrollü değildir — komşu byte'lar header/footer "çöp"üyle ezilir ve bozulma hedefi bu yan etkiye tolerans göstermelidir.

Bir vmalloc kurbanı bulmak ve KASLR'ı yenmek. vmalloc adresleri KASLR ile rastgeleleştirilmez ve çok erken allocation'lar öngörülebilir komşularla öngörülebilir adreslere düşer (/proc/vmallocinfo'ya göre). Araştırma, RemoteFS ringbuffer'ından sabit bir offset'te (+0x3eb8 olarak raporlanan) bir _do_fork allocation'ını — bir kernel thread stack'ini — hedefledi. Yakındaki bir bölge kthread'e sabit bir pointer tutuyordu; bu da kernel image'inin KASLR slide'ını sızdırdı.

Bir kernel thread'ini ele geçirmek. Linux scheduler tarafından zamanlanan kernel thread'leri öngörülebilir bir call stack'e sahiptir (ret_from_fork, worker_thread, kthread, schedule, ...). Thread'in zamanlamasıyla race ederek ve kaydedilmiş stack frame'ini overwrite ederek, yürütme bir ROP chain'e yönlendirilir ve kernel code execution elde edilir. Herkese açık chain, klasik bir poweroff_cmd/poweroff_work_func ROP'unun yalnızca ağır biçimde SELinux ile sınırlanmış bir kworker root verdiğini, bu yüzden daha güçlü bir post-exploitation hedefi seçildiğini belirtir.

Warning

Bu pivot, önceden gerçekleşmiş bir baseband ele geçirmesini varsayar ve patch'lenmiş bir konudan özetlenmiştir; metadata/ROP ayrıntıları kasıtlı olarak kavramsaldır ve silahlandırılmış bir chain'i atlar. Mimari düzeltme, CCCI shared-memory alanlarının AP tarafında doğrulanmasıdır.

Detection

  • Kernel logları: CCCI driver hataları/oops'ları ya da vmalloc bölgesindeki panic'ler, denenen bir modem-to-kernel pivot'unun göstergesidir.
  • Desteklenen yerlerde kernel thread stack'lerinin integrity monitoring'i / ROP tarzı control-flow anomalileri (örneğin CFI, shadow stack'ler).
  • MediaTek fix'inin mevcut olduğunu doğrulayan patch-level attestation.

Mitigation

  • AP↔CP shared memory'den okunan CCCI ringbuffer offset/length alanlarını doğrulayan MediaTek fix'ini (CVE-2022-21765 / CVE-2022-21769) uygula.
  • Defense in depth: modem RCE'sini pivot'un yukarısında patch'li tut (bkz. CVE-2022-21744); bir CCCI OOB'unun yükseltilmesini zorlaştırmak için kernel hardening'i etkinleştir (önemsiz olmayan vmalloc entropisiyle KASLR, CFI, RKP tarzı korumalar).
  • Ele geçirilmiş bir modemin ulaşabileceği şeyleri sınırlayacak şekilde, sıkı AP/baseband isolation'ı zorunlu kıl (shared bölge üzerinde IOMMU/SMMU kısıtlamaları).

References