
Technical writeup for CVE-2024-20154
वर्गीकरण: CWE-121 — स्टैक-आधारित बफ़र ओवरफ़्लो
गंभीरता: गंभीर (MediaTek बुलेटिन) · 8.8 उच्च, आक्रमण वेक्टर: सन्निकट (CISA-ADP)
प्रकार: दूरस्थ कोड निष्पादन — कोई उपयोगकर्ता इंटरैक्शन नहीं, कोई पूर्व संबद्धता नहीं
प्रकटीकरण: MediaTek सुरक्षा बुलेटिन, 6 जनवरी 2025 https://corp.mediatek.com/product-security-bulletin/January-2025
विश्लेषित लक्ष्य: Samsung Galaxy A14 SM-A145R — MT6769 परिवार (Helio G80), MediaTek की प्रभावित चिपसेट सूची में शामिल - फर्मवेयर को सुरक्षित परिस्थितियों में एमुलेट किया गया।
स्थिति: पैच किया गया।
यह मेरा पहला प्रकाशित बेसबैंड शोध था। मैं दूरसंचार बुनियादी ढांचे, कानूनी अवरोधन मध्यस्थता परतों, स्टिंग्रे और IMSI-कैचर विश्लेषण, और एम्बेडेड डिवाइस सुरक्षा से दूर पृष्ठभूमि से आता हूँ — मैंने पहले सेल्युलर मॉडम पर गहरी फर्मवेयर रिवर्स इंजीनियरिंग नहीं की थी। मैं खुद को साबित करना चाहता था कि एक संरचित विश्लेषणात्मक पद्धति लक्ष्यों पर अनुकूलित होती है, और किसी विशिष्ट प्लेटफ़ॉर्म की परिचितता को कड़ी श्रृंखला-ट्रेसिंग द्वारा प्रतिस्थापित किया जा सकता है। NB-IoT इसलिए अलग दिखा क्योंकि यह वास्तव में खतरनाक चौराहे पर बैठता है: प्रोटोकॉल सीमित IoT उपकरणों के लिए डिज़ाइन किया गया है, हमले की सतह पूर्व-संबद्धता है, और मॉडम स्टैक इसे संसाधित करता है भले ही हैंडसेट उपयोगकर्ता कुछ भी कर रहा हो।
जब पैच किए गए फर्मवेयर का विश्लेषण किया गया और कमजोर पैटर्न अनुपस्थित पाया गया, तो विशिष्ट फ़ंक्शन को लक्षित करने से पहले फर्मवेयर के बड़े पैमाने पर विश्लेषण के लिए उपयोग की जाने वाली AI प्रणाली ने
स्वतंत्र रूप से पुनर्निर्मित बग वर्ग, शर्तों और प्रभावित फर्मवेयर परिवार को CVE-2024-20154 के विवरण से मिलाया।
तकनीकी निष्कर्ष विश्लेषक के अपने हैं।
आपकी जेब में फ़ोन में कम से कम दो अलग-अलग कंप्यूटर होते हैं। जिसके साथ आप इंटरैक्ट करते हैं वह Android चलाता है। दूसरा — बेसबैंड — पूरी तरह से स्वतंत्र रूप से चलता है, सभी रेडियो संचार को संभालता है, और ऊपर के ऑपरेटिंग सिस्टम के लिए लगभग पूरी तरह से अदृश्य है। Android पूरी तरह से पैच किया जा सकता है। ब्राउज़र को सैंडबॉक्स किया जा सकता है। उपयोगकर्ता कभी भी किसी दुर्भावनापूर्ण लिंक पर टैप नहीं कर सकता है। इससे कोई फर्क नहीं पड़ता अगर कमजोर कोड मॉडम फर्मवेयर में है जो एप्लिकेशन प्रोसेसर के शामिल होने से पहले रेडियो सिग्नल प्रोसेस करता है।
CVE-2024-20154 बिल्कुल इसी प्रकार की कमजोरी है।
एक विकृत NB-IoT सिस्टम-सूचना प्रसारण MediaTek मॉडम फर्मवेयर को एक हमलावर-नियंत्रित शेड्यूलिंग गणना स्वीकार करने, उस गणना को RRC-से-L1 कॉन्फ़िगरेशन पथ पर बिना किसी क्लैंपिंग के ले जाने, और अंततः NB-IoT प्रसारण-चैनल हैंडलर के अंदर स्टैक-लेखन लूप के लिए लूप बाउंड के रूप में उपयोग करने का कारण बनता है। जब गणना गंतव्य सरणियों की क्षमता से अधिक हो जाती है, तो लूप उनके पार लिखता है, स्टैक पर सहेजे गए रजिस्टरों तक पहुँचता है, और सहेजे गए रिटर्न पते को अधिलेखित कर देता है। फिर फ़ंक्शन भ्रष्ट मान को रिटर्न-पते रजिस्टर में पुनर्स्थापित करता है और उस पर कूदता है।
गंभीरता को जो चीज़ बनाती है:
यह कमजोरी MediaTek के 6 जनवरी, 2025 के सुरक्षा बुलेटिन में गंभीर गंभीरता रेटिंग के साथ प्रकाशित की गई थी, जो अन्य के अलावा LR12A मॉडम परिवार को प्रभावित करती है। Samsung ने फरवरी 2025 के अपने सुरक्षा रखरखाव रिलीज़ में सुधार को शामिल किया।
यह पोस्ट एक शस्त्रीकृत एक्सप्लॉइट प्रकाशित नहीं करती है और यहाँ प्रकाशित चीज़ों से पुनरुत्पादनीय नहीं है। लक्ष्य यह दिखाना है कि श्रृंखला कहाँ टूटती है, प्रत्येक परत इसे रोकने में क्यों विफल रही, और लाइव मॉडम पर डीबगर संलग्न किए बिना बेसबैंड बग को जिम्मेदारी से मान्य करने में क्या लगता है।
प्राथमिक लक्ष्य: Samsung Galaxy A14 (SM-A145R)। रेडियो सबसिस्टम MT6769 चिपसेट परिवार (Helio G80) में एक MediaTek बेसबैंड प्रोसेसर द्वारा संचालित है। MT6769 परिवार CVE-2024-20154 के लिए MediaTek की प्रभावित चिपसेट सूची में स्पष्ट रूप से सूचीबद्ध है।``` AP/CP firmware: A145RXXU1AWD1 Modem software: MOLY LR12A.R3.TC10.6M.A14.PR.SP.V1.P5 Build date: 2023-04-18
बेसबैंड फर्मवेयर एंड्रॉइड कोड नहीं है। यह SoC के रेडियो सबसिस्टम पर एक अलग एंबेडेड सिस्टम है जिसका अपना CPU, अपना RTOS और एंड्रॉइड प्रक्रिया सैंडबॉक्स के बाहर अपना मेमोरी स्पेस है।
### 2.2 मॉडम आर्किटेक्चर
निकाले गए बाइनरी के विश्लेषण से पता चलता है कि मॉडम प्रोसेसर लिटिल-एंडियन मोड में MIPS16e2 संपीड़ित निर्देशों के साथ MIPS32 चलाता है। MIPS16e2 एंबेडेड कोड-आकार में कमी के लिए एक 16-बिट एन्कोडिंग एक्सटेंशन है — जो Helio-पीढ़ी के बेसबैंड के लिए MediaTek के दृष्टिकोण के अनुरूप है, इस SoC परिवार पर प्रकाशित स्वतंत्र बेसबैंड अनुसंधान द्वारा पुष्टि की गई है।
ऑपरेटिंग सिस्टम Nucleus RTOS है, जो कार्य शेड्यूलिंग, IPC संदेश कतारें और पूल-आधारित मेमोरी आवंटन प्रदान करता है। कर्नेल/उपयोगकर्ता विशेषाधिकार पृथक्करण, कार्यों के बीच मेमोरी प्रोटेक्शन यूनिट प्रवर्तन या हार्डवेयर स्टैक-गार्ड तंत्र नहीं है।
इस पोस्ट में सभी पते वर्चुअल पते हैं, जैसा कि Ghidra में बेस `0x90000000` पर लोड किए गए हैं।
### 2.3 शमन (विश्लेषित बिल्ड में देखे गए)
| शमन | स्थिति | प्रभाव |
|---|---|---|
| ASLR | अनुपस्थित | फर्मवेयर पते छवि से स्थिर और पूर्वानुमान योग्य हैं |
| स्टैक कैनरी | अनुपस्थित | `SAVE`/`RESTORE` बिना किसी गार्ड मान के कॉल-सेव रजिस्टरों को संग्रहीत करता है |
| NX / W^X | अनुपस्थित | स्टैक मेमोरी निष्पादन योग्य है |
| CFI | अनुपस्थित | रिटर्न पतों को किसी नीति के विरुद्ध मान्य नहीं किया जाता है |
### 2.4 विश्लेषण दृष्टिकोण
तीन समानांतर ट्रैक:
**स्थैतिक विश्लेषण.** सैमसंग फर्मवेयर पैकेज → CP विभाजन निष्कर्षण → `md1img.img` → Ghidra (MIPS LE 32-bit, बेस `0x90000000`) NCC Group `mtk_bp` टूलसेट का उपयोग करके फर्मवेयर डीबग अनुभाग से प्राप्त MediaTek इंजीनियरिंग प्रतीकों के साथ।
**गतिशील सत्यापन.** Unicorn Engine (MIPS32 एमुलेशन) का उपयोग दो चरणों में अलग-अलग फर्मवेयर रूटीन को निष्पादित करने के लिए किया गया था। चरण 1 ने मूल निर्देश जोड़ी के माध्यम से चैनल संदर्भ में `si_count` की असंयमित प्रतिलिपि को साबित करने का प्रयास किया। चरण 2 ने वास्तविक फर्मवेयर बाइट्स पर कमजोर लूप को निष्पादित किया और पुष्टि की कि फर्मवेयर के अपने निर्देश सहेजे गए रिटर्न पते को दूषित करते हैं। जहां चरण 1 पूरी तरह से मूल रूप से नहीं चल सका — क्योंकि CPHY डिस्पैच पथ के लिए आवश्यक RTOS सेवा-ऑब्जेक्ट वातावरण का पुनर्निर्माण नहीं किया गया था — वहां साइड इफेक्ट को सीधे मॉडल किया गया और सभी आउटपुट में इस प्रकार लेबल किया गया।
**रेडियो-पक्ष सत्यापन.** ZMQ लूपबैक के साथ srsRAN 4G — केवल सॉफ्टवेयर, कोई RF उत्सर्जन नहीं — ने पुष्टि की कि परीक्षण पेलोड NB-IoT PHY एन्कोडिंग और ट्रांसपोर्ट-ब्लॉक डिलीवरी में जीवित रहता है।
---
## 3. हमले की सतह: NB-IoT और SIB1-NB
### 3.1 पूर्व-संबद्धता हमले की सतह
NB-IoT (नैरोबैंड इंटरनेट ऑफ थिंग्स) 3GPP रिलीज़ 13 है, जिसे मौजूदा लाइसेंस प्राप्त LTE स्पेक्ट्रम का उपयोग करके विवश IoT उपकरणों को जोड़ने के लिए डिज़ाइन किया गया है। यह उपभोक्ता स्मार्टफोन सहित आधुनिक सेलुलर SoCs की एक विस्तृत श्रृंखला में कार्यान्वित किया गया है।
जबकि RRC_IDLE में, कोई भी RRC कनेक्शन स्थापित होने से पहले, सेवा की खोज करने वाला उपकरण निम्नलिखित करेगा:
1. सेल के समय संकेतों (NPSS/NSSS) से तालमेल बिठाएगा
2. NPBCH पर मास्टर सूचना ब्लॉक को डीकोड करेगा (640 ms ट्रांसमिशन विंडो)
3. NPDSCH से SIB1-NB को डीकोड करेगा (2560 ms शेड्यूल)
4. अतिरिक्त सिस्टम सूचना ब्लॉकों का पता लगाने के लिए SIB1-NB में शेड्यूलिंग जानकारी का उपयोग करेगा
चरण 3 पर, मॉडम एक ऐसी इकाई से एक संदेश को संसाधित करता है जिसे उसने प्रमाणित नहीं किया है, किसी भी कनेक्शन या उपयोगकर्ता इंटरैक्शन से पहले। सामान्य सेल चयन शर्तों को संतुष्ट करने वाला एक दुष्ट ट्रांसमीटर संसाधित किया जाएगा।```
+------------------+ +---------------------+
| Rogue Base Stn | | Target UE (Modem) |
+--------+---------+ +----------+----------+
| |
| NPSS/NSSS sync |
|--------------------------------------->|
| MIB-NB (640 ms cycle) |
|--------------------------------------->|
| SIB1-NB (malformed, si_count > 8) |
|--------------------------------------->| ← vulnerability triggered
| [no RRC connection established] |
SIB1-NB को 3GPP TS 36.331 में परिभाषित किया गया है। इसका schedulingInfoList फ़ील्ड यह बताता है कि सेल कितने सिस्टम सूचना संदेश प्रसारित करता है, जो स्पेक द्वारा अधिकतम 8 प्रविष्टियों (1..maxSI-Message-NB-r13 = 8) तक सीमित है। यह एक प्रोटोकॉल-लेयर बाधा है। मेमोरी-सुरक्षा बाधा — कि सूची की लंबाई गंतव्य सरणियों की क्षमता से अधिक नहीं होनी चाहिए — को फर्मवेयर द्वारा अलग से लागू किया जाना चाहिए।
ऐसा नहीं किया गया।
फर्मवेयर एक Samsung CP पैकेज से प्राप्त किया गया और NCC Group mtk_bp टूलसेट का उपयोग करके निकाला गया:```
md1img.img → md1_extract.py → 000_md1rom (17.8 MB code image)
→ 017_md1_dbginfo (XZ-compressed CATI debug symbols)
CATI डीबग अनुभाग को `mtk_dbg_extract.py symbols` से डीकंप्रेस और पार्स किया गया, फिर `ImportSymbolsScript.py` के माध्यम से Ghidra में आयात किया गया। परिणाम मॉडम स्टैक में पूर्ण आंतरिक फ़ंक्शन नाम थे — ERRC परत, L1 चैनल प्रबंधन, IPC उपतंत्र, और NB-IoT BCCH हैंडलर श्रृंखला — जिससे अर्थ-निर्देशित श्रृंखला पुनर्निर्माण संभव हुआ।
इस पोस्ट में सभी फ़ंक्शन नाम MediaTek के स्वयं के एम्बेडेड डीबग प्रतीकों से आते हैं जो फर्मवेयर इमेज से निकाले गए हैं।
---
## 5. भेद्यता
### 5.1 भेद्य लूप
`el1_ch_nbcch_resume_req` (`0x90213940`) NB-IoT ब्रॉडकास्ट-चैनल रिज़्यूम इवेंट को हैंडल करता है।
इसका MIPS16e2 फ़ंक्शन प्रस्तावना:```asm
90213940: save 0xE8, ra, s0-s1
SAVE निर्देश sp को 0xE8 से घटाता है और callee-saved रजिस्टरों को नीचे संग्रहीत करता है:```
old_sp (= new_sp + 0xE8)
new_sp + 0xE4 saved ra ← overflow target
new_sp + 0xE0 saved s1
new_sp + 0xDC saved s0
new_sp + 0x98 si_sched_arr [34 halfwords = 68 bytes]
new_sp + 0x78 si_type_arr [32 bytes]
new_sp + 0x00 ← stack pointer after SAVE
From Ghidra decompile of the actual firmware binary:```c
for (uVar6 = 0; uVar6 < (byte)param_2[0x40a]; uVar6 = uVar6 + 1) {
si_type_arr[uVar6] = /* SI type byte */; // 1 byte/iter, base new_sp+0x78
si_sched_arr[uVar6] = /* SI schedule halfword */; // 2 bytes/iter, base new_sp+0x98
}
param_2[0x40a] ch_ctx[+0x40A] है — चैनल संदर्भ BSS संरचना में एक स्थायी बाइट।
लूप बाउंड का सीधे उपयोग किया जाता है, बिना सरणी क्षमताओं के विरुद्ध किसी पूर्व तुलना के।
स्ट्रीम A (halfword sh लेखन) new_sp+0x98 से शुरू होता है और प्रति पुनरावृत्ति 2 बाइट आगे बढ़ता है।
यह संग्रहीत RA तक new_sp+0xE4 पर पुनरावृत्ति 38 में पहुँचता है:```
new_sp + 0x98 + i×2 = new_sp + 0xE4
i = (0xE4 - 0x98) / 2 = 0x4C / 2 = 38
स्ट्रीम B (बाइट `sb` लिखता है) `new_sp+0x78` से शुरू होता है और RA स्लॉट तक पहुँचने के लिए पुनरावृत्ति 108 की आवश्यकता होगी:```
new_sp + 0x78 + i = new_sp + 0xE4
i = 0xE4 - 0x78 = 108
With si_count = 40 (प्रदर्शक मान, जो 38 की ओवरफ्लो सीमा से अधिक होने के लिए चुना गया) के साथ लूप 40 बार चलता है। स्ट्रीम B कभी RA स्लॉट तक नहीं पहुँचती। RA भ्रष्टाचार पूरी तरह से स्ट्रीम A से आता है।
40 पुनरावृत्तियों के बाद MIPS16e2 RESTORE निर्देश स्टैक से भ्रष्ट मान को $ra में पुनः लोड करता है, और jrc ra नियंत्रण स्थानांतरित करता है।
ch_ctx[+0x40A] को el1_ch_nbcch_start द्वारा 0x90213444 पर लिखा जाता है। दो लगातार MIPS निर्देश जिनके बीच कुछ नहीं है:```asm
; el1_ch_nbcch_start @ 0x90213444
lbu v0, 0x99(s0) ; read IPC_msg[+0x99] = si_count from CPHY_CFG_REQ
sb v0, 0x40A(s1) ; write to ch_ctx[+0x40A] — no clamp, no mask, no compare
### 5.4 The ERRC builder — Layer A
CPHY_CFG_REQ बफर ERRC लेयर में डिकोड किए गए SIB1-NB से बनाया गया है। फ़ंक्शन `errc_chm_l1_set_bcch_si_reception` `IPC_msg[+0x99]` लिखता है:```c
// errc_chm_l1_set_bcch_si_reception — Layer A
// Loop bound: decoded schedulingInfoList entry count from SIB1-NB
while (bVar3 < *(byte *)(param_3 + 0x44) && (param_2 != 0)) {
bVar3++;
if (uVar2 != param_2) {
*param_5 = *param_5 + 1; // CPHY_CFG_REQ[+0x99]++ — no upper bound check
}
}
The loop bound is the decoded entry count from SIB1-NB. The counter increments once per decoded entry, for as many entries as were decoded, with no maximum guard.
Once the CPHY_CFG_REQ buffer is populated, ERRC dispatches it to L1 with sap_id = 0x501F as the routing key:```
el1_ch_rcv_ilm (sap 0x501F)
→ el1_chmgm_errc_cfg_req_in_idle ← stores CPHY_CFG_REQ @ L1_ctx[+0x323C]
→ el1_chmgm_nbcch_handler
→ el1_ch_nbcch_main
→ el1_ch_nbcch_cphy_cfg_req_process ← validates cell identity, no si_count check
→ el1_ch_nbcch_start @ 0x90213444 ← Layer B: lbu + sb, no clamp
### 5.6 तीन-परत क्लैम्पिंग का अभाव
| परत | फ़ंक्शन | पता | क्लैम्प मौजूद? |
|---|---|---|---|
| A — ERRC निर्माता | `errc_chm_l1_set_bcch_si_reception` | ERRC रेंज | **कोई नहीं** |
| B — L1 प्रतिलिपि | `el1_ch_nbcch_start` | `0x90213444` | **कोई नहीं** |
| C — L1 लूप | `el1_ch_nbcch_resume_req` | `0x90213940` | **कोई नहीं** |
किसी भी एक परत पर एक भी जाँच श्रृंखला को तोड़ देती।
### 5.7 मूल कारण
एक उल्लंघित अपरिवर्तनीय:
> SI शेड्यूलिंग प्रविष्टियों की संख्या कभी भी गंतव्य सरणी क्षमता से अधिक नहीं होनी चाहिए।
3GPP अभिप्रेत प्रोटोकॉल बाउंड (8 प्रविष्टियाँ) प्रदान करता है। फर्मवेयर को मेमोरी-सुरक्षा बाउंड को हर उस परत पर लागू करना था जहाँ गणना अनुक्रमणिका या लूप सीमा बन जाती है। कमजोर बिल्ड में, गणना SIB1-NB प्रसारण फ़ील्ड से ERRC डिकोडर, CPHY_CFG_REQ संदेश में, IPC सीमा पार L1 कार्य में, चैनल संदर्भ BSS में, और एक स्टैक-लेखन लूप में यात्रा करती थी — बिना किसी परत क्लैम्पिंग के।
---
## 6. कॉल चेन — यह कैसे पाया गया
### 6.1 दो-पथ भ्रम
दो संरचनात्मक रूप से समान लेकिन अलग-अलग पथ `el1_ch_nbcch_main` को 0x760-बाइट कॉन्फ़िगरेशन बफ़र दे सकते हैं:
| पथ | स्रोत | `[+0x99]` मान | प्रासंगिकता |
|---|---|---|---|
| पथ A (ERRC → L1 IPC) | ERRC डिकोड किए गए SIB1-NB से CPHY_CFG_REQ बनाता है | OTA से `schedulingInfoList.count` | **कमजोर पथ** |
| पथ B (L1 आंतरिक) | `el1_ch_scs_ind_send` आंतरिक IPC बॉडी बनाता है | हार्डकोडेड `1` | कमजोर नहीं |
पथ B ने संदेश प्रारूप की पुष्टि की — बाइट `+0x99` वह SI गणना है जिसे `el1_ch_nbcch_start` उपभोग करता है। चूँकि इसकी गणना हमेशा 1 पर हार्डकोडेड होती है, यह ओवरफ़्लो नहीं कर सकता। बाहरी रूप से प्रभावित पथ पथ A है।
### 6.2 लेखक खोज
ऑफ़सेट `+0x99` पर लिखने वाले किसी भी निर्देश के लिए फर्मवेयर में पैटर्न-खोज ने शोर उत्पन्न किया: T1 (प्रत्यक्ष `sb`, ~100 हिट), T2 (विभाजित आधार, 5 हिट), T3 (गणना ऑफ़सेट, 0), T4 (अतिव्यापी `sh`/`sw`, ~465)। ERRC चैनल प्रबंधन फ़ंक्शन `msg_send6` क्रॉस-रेफ़रेंस सूची से अनुपस्थित थे क्योंकि ERRC `errc_com_send_msg` का उपयोग करता है। एक एमुलेशन जाँच ने ERRC-पक्ष पर लेखन की पुष्टि की: L1 डिस्पैचर से Unicorn हार्नेस चलाना और बफ़र के `+0x99` ऑफ़सेट पर लिखने के लिए देखना L1 पक्ष से कुछ भी कैप्चर नहीं कर सका।```
[RUN] dispatcher=0x90214418 watching IPC_msg+0x99
NO writes to IPC_msg+0x99 caught from dispatcher.
Write happened before el1_ch_nbcch_main — confirmed ERRC-side.
errc_com_send_msg में sap_id = 0x501F का अनुसरण करते हुए el1_chmgm_errc_cfg_req_in_idle की ओर रूटिंग की पहचान की गई, जो L1_ctx[+0x323C] पर CPHY_CFG_REQ पॉइंटर को संग्रहीत करता है और डाउनस्ट्रीम डिस्पैच शुरू करता है।
SIB1-NB schedulingInfoList.count (demonstrator: 40) │ ▼ [ERRC task] errc_chm_ch_ctrl_req_hdlr → errc_chm_call_ctrl → errc_chm_l1_main → errc_chm_l1_call_ctrl → errc_chm_l1_snd_cphy_cfg_req ← allocates 0x760-byte CPHY_CFG_REQ → errc_chm_l1_set_cphy_req_nbcch_cfg → errc_chm_l1_set_bcch_inf → errc_chm_l1_set_bcch_si_reception ← Layer A: CPHY_CFG_REQ[+0x99] = 40 → errc_com_send_msg(sap=0x501F) ← IPC to L1 │ ▼ [L1 task] el1_ch_rcv_ilm (sap 0x501F) → el1_chmgm_errc_cfg_req_in_idle ← stores CPHY_CFG_REQ @ L1_ctx[+0x323C] → el1_chmgm_nbcch_handler → el1_ch_nbcch_main → el1_ch_nbcch_cphy_cfg_req_process ← no si_count validation → el1_ch_nbcch_start @ 0x90213444 ← Layer B: lbu + sb, no clamp │ ▼ ch_ctx[0x40A] = 40 (persists in BSS) │ ▼ [state machine advances to 0x0B, event 0x2C] el1_ch_nbcch_resume_req @ 0x90213940 ← Layer C: loop bound from ch_ctx[0x40A] │ ▼ stack overflow → jrc ra → PC = attacker-controlled
---
## 7. सत्यापन
यह विशिष्ट SM-A145R मॉडल सामान्य शिप-बिल्ड संचालन में कमजोर NB-IoT कोड पथ का उपयोग करता हुआ प्रतीत नहीं होता है, यही कारण है कि प्रत्यक्ष हार्डवेयर प्रतिकृति के बजाय हाइब्रिड अनुकरण और स्थैतिक विश्लेषण का उपयोग किया गया।
**स्थैतिक रूप से सिद्ध।** फर्मवेयर बाइनरी में कमजोर निर्देश जोड़ी शामिल है। कॉल श्रृंखला प्रतीकों, क्रॉस-रेफरेंस और डीकंपाइल फ़ंक्शन बॉडी से पुनर्निर्मित की गई है।
**अनुकरण में मूल रूप से निष्पादित।** `el1_ch_nbcch_resume_req` के अंदर का लूप यूनिकॉर्न इंजन (MIPS32) में वास्तविक MediaTek फर्मवेयर बाइट्स पर चला। फर्मवेयर का अपना `sh` निर्देश `0x90213B02` पर सहेजे गए रिटर्न-एड्रेस स्लॉट में लिखा गया। `RESTORE` निर्देश ने दूषित मान को `$ra` में लोड किया, और `jrc ra` ने नियंत्रण स्थानांतरित किया।
**स्पष्ट रूप से मॉडल किया गया।** `el1_ch_nbcch_start` में `lbu`/`sb` प्रतिलिपि पूरी तरह से मूल रूप से नहीं चलाई जा सकी क्योंकि `el1_ch_nbcch_cphy_cfg_req_process` के अंदर RTOS कॉलबैक-टेबल डिस्पैच पथ को लाइव Nucleus हीप ऑब्जेक्ट की आवश्यकता थी जो फ्लैट एमुलेटर प्रदान नहीं करता था। चरण 2 में रेज़्यूम हैंडलर (`el1_ch_nbcch_resume_req`) केवल BSS-निवासी चैनल संदर्भ से पढ़ता है और उसी डिस्पैच पथ पर नहीं आता है, यही कारण है कि चरण 2 समान मचान की आवश्यकता के बिना मूल रूप से चला। चरण 1 का पार्श्व प्रभाव — `IPC_msg[+0x99]` से एक बाइट `ch_ctx[+0x40A]` पर लिखा गया — सीधे मॉडल किया गया और `[PHASE1-MODEL]` लेबल किया गया।
**दावा नहीं किया गया।** एक पूर्ण एंड-टू-एंड ओवर-द-एयर हार्डवेयर प्रतिकृति।
### 7.1 एंटी-टैम्पर
हार्नेस ने एक नियम लागू किया: किसी भी हुक को प्रमाण मार्कर को सहेजे गए रिटर्न-एड्रेस स्लॉट में लिखने की अनुमति नहीं थी। प्रत्येक गैर-फर्मवेयर मेमोरी राइट को ट्रैक किया गया।```
[PROOF-W] saved_RA write: pc=0x90213b02 addr=new_sp+0xE4 value=0xbeef
[PROOF-W] saved_RA write: pc=0x90213b02 addr=new_sp+0xE6 value=0xdead
[ANTI-TAMPER] no hook wrote RA=0xDEADBEEF — firmware only
anti_tamper_fail = False
0x90213B02 लूप बॉडी के अंदर sh निर्देश है। फर्मवेयर ने इन बाइट्स को रखा पर
अनुमानित स्टैक ऑफ़सेट। लिटिल-एंडियन स्टोरेज में, हाफवर्ड 0xBEEF और 0xDEAD
पर new_sp+0xE4 और new_sp+0xE6 मिलकर [ef be ad de] = 0xDEADBEEF बनाते हैं।
[REGS] RA = 0xdeadbeef ← firmware wrote this; decisive proof PC = 0x00000000 ← Unicorn unmapped-fetch artifact, not a hardware exception vector
[STACK] new_sp+0xE4: [ef be ad de] ← little-endian 0xDEADBEEF
[PC-EXPLAIN] PC=0 is an unmapped-fetch artifact; decisive proof is RA=0xDEADBEEF + stack bytes [ef be ad de] + [PROOF-JRC] CONFIRMED: saved RA = 0xDEADBEEF
### 7.3 ZMQ वितरण
यह पुष्टि करने के लिए कि परीक्षण पेलोड NB-IoT PHY एन्कोडिंग और ट्रांसपोर्ट-ब्लॉक वितरण से बच जाता है, srsRAN 4G का उपयोग ZMQ लूपबैक (कोई RF उत्सर्जन नहीं) के साथ किया गया था। पेलोड जानबूझकर एक गैर-अनुरूप वेक्टर था — `schedulingInfoList` पर ASN.1 SIZE बाधा को 40 प्रविष्टियों की अनुमति देने के लिए शिथिल किया गया था, जिसमें pycrate राउंड-ट्रिप डिकोड ने बाइट 14 पर गणना फ़ील्ड की पुष्टि की।```
SIB1 received
SIB2 activated
exit 0
यह परिवहन-परत वितरण की पुष्टि करता है। फर्मवेयर-पक्ष ASN.1 व्यवहार Layer A स्थैतिक विश्लेषण द्वारा स्थापित किया गया है।
el1_ch कार्य में एक स्टैक है। चरण 1 और चरण 2 दो अलग-अलग IPC घटनाएँ हैं जो समान कार्य द्वारा अनुक्रमिक रूप से संसाधित की जाती हैं, उनके बीच स्टैक पूरी तरह से अनवाइंड होता है। गणना चैनल संदर्भ BSS में बनी रहती है, न कि स्टैक पर:```
EVENT: CPHY_CFG_REQ (Phase 1)
el1_ch_nbcch_start
lbu v0, 0x99(s0)
sb v0, 0x40A(s1) ← ch_ctx[0x40A] = attacker value, written to BSS
returns — stack fully unwound
EVENT: resume (state 0x0B, msg 0x2C) (Phase 2) el1_ch_nbcch_resume_req ← frame 0xE8, reads ch_ctx[0x40A] as loop bound loop × 40 → saved RA corrupted jrc ra → attacker-controlled PC
`ch_ctx[0x40A]` BSS में रहता है और मॉडेम रीसेट होने या बाद के चैनल कॉन्फ़िगरेशन द्वारा इसे ओवरराइट किए जाने तक हमलावर के मान को बनाए रखता है।
### 8.2 स्टैक फ्रेम```
old_sp (= new_sp + 0xE8)
new_sp + 0xE4 saved ra
new_sp + 0xE0 saved s1
new_sp + 0xDC saved s0
new_sp + 0x98 si_sched_arr [34 halfwords = 68 bytes]
new_sp + 0x78 si_type_arr [32 bytes]
फ़्रेम आकार की पुष्टि एमुलेशन मापन से हुई। ऐरे स्थानों की पुष्टि एमुलेशन से हुई
परिणाम — RA को 38वें पुनरावृत्ति पर लिखा गया, जो new_sp+0x98 से शुरू होने वाले si_sched_arr के अनुरूप है।
| बिल्ड | मॉडम फ़र्मवेयर | बिल्ड तिथि |
|---|---|---|
| असुरक्षित | A145RXXU1AWD1, MOLY LR12A...V1.P5 | 2023-04-18 |
| पैच किया गया | A145RXXUDDZC2, MOLY LR12A...V3.P8 |
बिल्ड तिथियों की पुष्टि दोनों इमेज से md1_dbginfo मेटाडेटा निकालकर की गई। पैच आईडी: MOLY00720348 · Issue ID: MSV-2392।
el1_ch_nbcch_start (असुरक्षित बाइनरी में 0x90213444): lbu/sb निर्देश युग्म अनुपस्थित है। IPC_msg[+0x99] का ch_ctx[+0x40A] में सीधा कॉपी हटा दिया गया है।
el1_ch_nbcch_resume_req (असुरक्षित बाइनरी में 0x90213940): ch_ctx[0x40A] पर स्टैक-लेखन लूप अनुपस्थित है। जहाँ एक अविश्वसनीय बाइट निश्चित आकार के स्टैक ऐरे पर लूप सीमा बन जाती है, वह वास्तुकला अब मौजूद नहीं है। फंक्शन बॉडी को एक अलग डिस्पैच संरचना से बदल दिया गया है।
errc_chm_l1_set_bcch_si_reception: असीमित काउंटर लूप को सत्यापन-उन्मुख हेल्पर कॉल से बदल दिया गया है।
दो फंक्शन जो पैच किए गए बाइनरी में मौजूद हैं, असुरक्षित बाइनरी में अनुपस्थित हैं:``` el1_ch_nbcch_param_check el1_ch_scell_param_check
एकल-पंक्ति सीमा जाँच उसी पते पर मौजूद किसी फ़ंक्शन के अंदर कुछ जोड़े गए निर्देशों के रूप में दिखाई देगी। पैच की गई बाइनरी जो दिखाती है वह एक आर्किटेक्चरल संशोधन है: NBCCH शेड्यूलिंग पथ को इस तरह से पुनः डिज़ाइन किया गया था कि `si_count`-एज़-लूप-बाउंड पैटर्न अब पथ में कहीं भी मौजूद नहीं है।
### 10.4 CVE विशेषता
यहां वर्णित कमजोरी, MediaTek द्वारा 6 जनवरी, 2025 को प्रकाशित CVE-2024-20154 से मेल खाती है। पुष्टि का आधार:
- प्रभावित फर्मवेयर परिवार (LR12A) MediaTek के बुलेटिन से मेल खाता है।
- कमजोरी वर्ग — स्टैक ओवरफ़्लो, गायब सीमा जाँच, दुष्ट बेस स्टेशन से RCE, कोई उपयोगकर्ता इंटरैक्शन नहीं — CVE विवरण और NVD रिकॉर्ड से मेल खाता है।
- पैच किया गया फर्मवेयर कमजोर के रूप में पहचानी गई कोड संरचनाओं को हटा देता है।
- पैच ID MOLY00720348 MediaTek के बुलेटिन और Android सुरक्षा बुलेटिन (A-376809176) से पुष्टि की गई है।
- AI-सहायता प्राप्त विश्लेषण ने मैन्युअल पुष्टि से पहले स्वतंत्र रूप से पुनर्निर्मित पैटर्न को CVE-2024-20154 से मिलान किया।
---
## 11. नैतिकता और जिम्मेदार प्रकटीकरण
### 11.1 इस पोस्ट में क्या नहीं है
कोई हथियारबंद एक्सप्लॉइट नहीं। कोई फर्मवेयर बाइनरी सामग्री नहीं। कोई विकृत पेलोड बाइट्स नहीं। लाइव डिवाइस पर कमजोरी को ट्रिगर करने की कोई चरण-दर-चरण प्रक्रिया नहीं। एक काम करने वाले हमले को पुन: उत्पन्न करने के लिए आवश्यक जानकारी — विशिष्ट मॉडेम डिकोडर के लिए पूर्ण पेलोड निर्माण, पूर्ण चरण 1 एमुलेशन के लिए RTOS हीप-ऑब्जेक्ट मचान, ओवर-द-एयर रेडियो कॉन्फ़िगरेशन — जानबूझकर अनुपस्थित है।
### 11.2 ZMQ लूपबैक और एमुलेशन नैतिक दृष्टिकोण क्यों हैं
ZMQ लूपबैक का अर्थ है कि कभी भी कोई सिग्नल हवा में प्रसारित नहीं किया गया। किसी वास्तविक डिवाइस को लक्षित नहीं किया गया। कोई कैरियर नेटवर्क शामिल नहीं था। प्रूफ पूरी तरह से विश्लेषक के स्वामित्व वाले हार्डवेयर पर एक संलग्न सॉफ्टवेयर वातावरण में चलता है। प्री-एसोसिएशन रेडियो कमजोरी को मान्य करने का यह सही तरीका है — एक विकृत प्रसारण प्रसारित करने से रेंज में किसी भी डिवाइस पर प्रभाव पड़ेगा।
Unicorn एमुलेशन प्रदर्शित करता है कि कमजोर व्यवहार फर्मवेयर बाइनरी में ही है, प्रतिलिपि प्रस्तुत करने योग्य रूप से, किसी विशिष्ट डिवाइस स्थिति या रेडियो वातावरण से स्वतंत्र। यह एकल हार्डवेयर क्रैश की तुलना में तकनीकी रूप से मजबूत दावा है, और यह हवा में कुछ भी तैनात करने से बचता है।
### 11.3 MediaTek बौद्धिक संपदा
सभी विश्लेषण उपभोक्ता डिवाइस से और Samsung के सार्वजनिक रूप से जारी फर्मवेयर पैकेजों से वैध रूप से प्राप्त फर्मवेयर पर किया गया था। किसी मालिकाना दस्तावेज़ का उपयोग नहीं किया गया। आंतरिक MediaTek स्ट्रक्ट परिभाषाएँ और IPC संदेश प्रारूप केवल उस हद तक वर्णित हैं जो मेमोरी-सुरक्षा विफलता की व्याख्या करने के लिए आवश्यक है। उन्हें विनिर्देशों के रूप में प्रकाशित नहीं किया गया है।
---
| पुनरावृत्ति | sh लिखता है | प्रभाव |
|---|
| 0–33 | si_sched_arr[0..33] | सीमा के भीतर |
| 34–35 | new_sp+0xDC — saved s0 | s0 भ्रष्ट |
| 36–37 | new_sp+0xE0 — saved s1 | s1 भ्रष्ट |
| 38 | new_sp+0xE4 — saved ra [15:0] | RA निम्न आधा शब्द |
| 39 | new_sp+0xE6 — saved ra [31:16] | RA उच्च आधा शब्द |
| गेट | शर्त | जाँच का स्थान |
|---|
| NB-IoT सक्रिय पथ | cfg_type == 1 | el1_ch_nbcch_cphy_cfg_req_process |
| चैनल पूर्ण नहीं | done_flag == 0 | ch_ctx[0x438] |
स्टेट मशीन 0x0B | NBCCH पुनरारंभ स्थिति में | el1_ch_nbcch_main डिस्पैच |
| si_count शून्येतर | ch_ctx[0x40A] > 0 | लूप शर्त |
| बैंड वर्ग ≤ 2 | मान्य NB-IoT मोड | el1_ch_nbcch_resume_req का प्रवेश |
el1_chmgm_cell_info_get शून्येतर | सेवा तालिका में सेल | el1_ch_nbcch_start में कॉल किया गया |
| फंक्शन | पता | भूमिका | क्लैम्प? |
|---|
errc_chm_l1_set_bcch_si_reception | ERRC रेंज | CPHY_CFG_REQ[+0x99] लिखता है | कोई नहीं |
el1_ch_nbcch_cphy_cfg_req_process | 0x90213F80 | CPHY कॉन्फ़िग को L1 में रूट करता है | N/A — si_count नहीं पढ़ता |
el1_chmgm_cell_info_get | 0x9020E0D0 | EARFCN/PCI को मान्य करता है | N/A |
el1_ch_nbcch_start | 0x90213444 | गणना को BSS में कॉपी करता है | कोई नहीं |
el1_ch_nbcch_resume_req | 0x90213940 | गणना को लूप सीमा के रूप में उपयोग करता है | कोई नहीं |
| 2025-04-23 |