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/lengthalanları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ı).