Full Chain Baseband Exploits: MediaTek baseband RCE CVE-2022-21744¶
TASZK Labs'ın MediaTek'in GPRS Packet Neighbour Cell Data handler'ındaki over-the-air heap buffer overflow'u (CVE-2022-21744): sınırsız bir fragment count, sabit 32-slot'luk bir pointer array'i overflow ederek baseband runtime'ında remote code execution verir.
Mechanism¶
Note
Bir handset'in baseband'i, application processor'dan (AP) izole bir processor üzerinde kendi RTOS'unu ve tam bir cellular protocol stack'ini çalıştırır. İçeriği network tarafından dikte edilen radio-link signaling'i parse eder ve handset tarihsel olarak serving cell'in iyi niyetli olduğuna güvenir. Burada kırılan trust boundary radio-to-baseband'dir: rogue bir 2G/GPRS cell, crafted Packet Neighbour Cell Data (PNCD) message'larını doğrudan parser'a besleyip baseband heap memory'sini bozabilir.
Başarısız olan invariant, fragment count üzerindeki bir bounds check'tir.
PNCD message'ları (3GPP TS 44.060 §11.2.9e) fragmentation destekler: bir
logical container'ın verisi, en fazla 32 PNCD message üzerinde bir
CONTAINER_INDEX ile sıralanan birden çok Container repetition struct
girişine yayılır. MediaTek'in FDD_rr_put_pncd_qmsg'i per-fragment
pointer'ları tutmak için 128-byte'lık bir array allocate eder — her iki
modem mimarisinde de (interAptive ve I7200) tam olarak 32 adet four-byte slot.
Ama specification repetition sayısını asla kısıtlamaz ve parsing kodu 32-entry
limitini asla enforce etmez. Tek bir PNCD message kabaca on Container Data
field'ı paketleyebildiği ve 32 message'a kadar kabul edildiği için, attacker
300+ fragment sağlayabilir — her biri 32-slot'luk array'in sonunun
ötesine bir pointer yazar.
Sonuç, attacker-controlled length'li bir heap buffer overflow'dur. Kritik
nokta: overwrite edilen değer ham attacker byte'ları değil, body'sini
attacker'ın 21 byte'a kadar keyfi Container Data ile doldurduğu, yeni
allocate edilmiş 28-byte'lık bir chunk'a giden bir pointer'dır. Yani
corruption primitive'i pointer-to-controlled-data write'tır; public araştırma
bunu direkt overwrite yerine heap metadata manipulation ile sömürür.
Walkthrough¶
Aşağıdaki, yalnızca public TASZK advisory'sinden ve patch'lenmiş MediaTek bülten materyalinden türetilmiş, açıklayıcı ve conceptual bir reproduction yoludur.
Parser'a ulaşmak. PNCD, network'ün komşu bir cell için system information
iletmek üzere PACCH'te gönderdiği opsiyonel bir message'dır. Firmware'de
FDD_rmpc_mac_rmpc_pncd_ind_hdlr → FDD_rmpc_save_pncd_raw_data →
FDD_rmc_save_pncd_raw_data → FDD_rr_put_pncd_qmsg çağrı zinciri üzerinden
dispatch edilir. (Aynı fonksiyonlar time-division varyantı için TDD_
prefix'leriyle de vardır, attack surface'i ikiye katlar.)
Vulnerable accumulation. Her Container Data fragment'ı geldikçe firmware
ona bir pointer saklar. Public pseudocode eksik bound'u gösterir:
Decompiled pseudocode of the accumulation (from the TASZK advisory)
def FDD_rr_put_pncd_qmsg(src, size, qmsg):
# allocate the pointer array if this is the first element
if qmsg->current_num == 0:
# this is enough space for 32 pointers (0x80 / 4)
qmsg->ptr_to_msg_ptr_array = get_ctrl_buffer_ext(0x80)
qmsg->valid = True
# allocate + zero a 28-byte chunk for the current message content
ptr_to_msg_ptr_array[current_num] = get_ctrl_buffer_ext(28)
memset(ptr_to_msg_ptr_array[current_num], 0, 28)
# copy the fragment (size is always 21 when called from PNCD)
memcpy(ptr_to_msg_ptr_array[current_num]->msg, src, size)
ptr_to_msg_ptr_array[current_num]->msg_len = size * 8
ptr_to_msg_ptr_array[current_num]->offset = 0
# advance the queue state — NO bound on current_num
qmsg->current_num += 1
qmsg->total_num = qmsg->current_num
current_num'ın 32'yi aşmasına izin verildiğinde, indexed store
ptr_to_msg_ptr_array[current_num] = ... pointer'ları 0x80-byte'lık
allocation'ın ötesine yazar: komşu heap chunk'lara controlled-length bir
out-of-bounds pointer write.
Corruption'dan code'a. Her overflow eden slot, 21 attacker byte'a kadar tutan 28-byte'lık bir chunk'a giden bir pointer'dır. Açıklanan exploitation stratejisi (TASZK "Full Chain Baseband Exploits", Part 2) komşu heap allocator metadata'sını bozar; böylece sonraki allocation'lar yönlendirilir ve nihayetinde bir code pointer'ın kontrolü ve baseband'de arbitrary code execution elde edilir. Bug tamamen, prior authentication olmadan rogue bir cell'den ulaşılabilen 2G/GPRS attack surface'idir.
Warning
PNCD message'larını teslim etmek için bir GSM/GPRS transmitter işletmek, yetki ya da shielded RF chamber olmadan licensed spectrum'da yasa dışıdır. Bu giriş, patch'lenmiş (Temmuz 2022 sonrası) bir sorunu özetler ve weaponized end-to-end bir zinciri kasıtlı olarak atlar; metadata-attack detayları conceptual'dır.
Bu MediaTek baseband RCE'si, pivot aşaması MediaTek baseband-to-kernel pivot CVE-2022-21765 içinde dokümante edilen daha uzun bir zincirin giriş noktasıdır.
Detection¶
- Rogue GPRS cell'ler (beklenmedik 2G re-selection, IMSI-catcher
signature'ları) ve anormal sayıda
Container repetition structfragment'ı taşıyan PNCD message'ları için network-side anomaly detection. - On-device baseband telemetry: RR/PNCD handler'larındaki (
FDD_/TDD_rmpc_*) crash/reset'ler exploitation girişiminin göstergesidir. - Fleet management: MediaTek security-bulletin patch seviyesinin uygulandığını doğrula (Temmuz 2022 ya da sonrası).
Mitigation¶
- Eksik fragment-count bound'unu ekleyen, Temmuz 2022'den sonra yayınlanan OTA image'larındaki MediaTek fix'ini uygula (MediaTek Security Bulletin, Temmuz 2022, CVE-2022-21744).
- Deployment izin veriyorsa 2G/GPRS fallback'i devre dışı bırak, attack surface'i tamamen kaldır.
- Baseband hardening: bounds-checked variable-length parsing, heap allocator integrity ve AP/baseband isolation — böylece compromise edilmiş bir modem AP memory'sine doğrudan ulaşamaz (yukarıdaki kernel-pivot girişine bakın).
References¶
- CVE-2022-21744: Mediatek Baseband GPRS PNCD Heap Buffer Overflow — TASZK Labs
- Full Chain Baseband Exploits, Part 2 — TASZK Labs
- 3GPP TS 44.060 §11.2.9e (PNCD message content / Container repetition struct)