摘要
研究報告針對 Unisoc T612 數據機韌體中一項重大遠端程式碼執行 (Remote Code Execution, RCE) 漏洞提供詳盡的技術分析。該漏洞歸類為不受控制的遞迴 (Uncontrolled Recursion / CWE-674),存在於數據機 SIP 堆疊中的會話描述協議 (Session Description Protocol, SDP) 解析邏輯 [1]。攻擊者可利用
_SDPDEC_AcapDecoder
函式的遞迴特性觸發堆疊溢位(Stack Overflow),進而破壞相鄰任務環境(即
sblock_0_2
任務)中的記憶體。此分析深入探討根本原因、檢視有漏洞的程式碼結構,並討論涉及 IMS 環境中資料碎片化(Data fragmentation)的利用機制。此外,我們也將這些發現與當代研究
[2]
中所觀察到的更廣泛 API 與協定安全原則進行關聯。
1. 簡介
蜂巢式數據機韌體的安全性至關重要,因為它是行動裝置與全球電信基礎設施之間的主要介面。此類元件中的漏洞往往能繞過作業系統層級的安全控制,為遠端攻擊提供直接路徑。廣泛應用於多種行動裝置的 Unisoc T612 晶片組,在處理 SIP/SDP 信號訊息時被發現存在一項重大缺陷。與傳統依賴固定大小緩衝區的緩衝區溢位不同,此漏洞利用遞迴函式呼叫中的邏輯缺陷來實現記憶體損壞 [1] 。
2. 技術根本原因分析
此漏洞的核心在於
_SDPDEC_AcapDecoder
函式,該函式負責解碼 SDP 訊息中的
acap
(屬性能力)屬性。此函式的設計允許它在未實作深度限制或遞迴狀態驗證的情況下,查詢並呼叫後續屬性的處理常式。
2.1 有漏洞的解碼器邏輯
當 SIP 堆疊遇到
acap
屬性時,會呼叫
_SDPDEC_AcapDecoder
。此函式會解析屬性值,然後嘗試在
SipHandler_AttrDecoder
表格中尋找下一個屬性。如果在同一行中發現另一個
acap
屬性,該函式會再次呼叫該處理常式,從而導致遞迴
[1]
。
- /*
- * Simplified representation of the vulnerable _SDPDEC_AcapDecoder function.
- * This function handles the "acap" attribute in SDP messages.
- */
- undefined8 _SDPDEC_AcapDecoder(Token *token, ParseBuffer *parse_buffer, SdpMsgStruct *hSdpMsg) {
- int iVar2;
- sipHandlerFunc *handler;
- SdpMsgStruct *handler_id;
- // Log the current message and attribute state for debugging
- display_sip_message(0x200, "_SDPDEC_AcapDecoder: hSdpMsg:%X", hSdpMsg);
- // Attempt to get the next token from the parse buffer
- iVar2 = (*token->handlerGetToken)(token, parse_buffer, " ");
- if (iVar2 == 1) {
- // Search for the appropriate handler in the SipHandler_AttrDecoder table
- // This is where the recursive call is triggered if the next attribute is also "acap"
- iVar2 = search_handler(&token->CurrToken, SipHandler_AttrDecoder, 0x38, &handler_id);
- // Retrieve the handler function pointer from the table
- handler = SipHandler_AttrDecoder[(int)handler_id].handler;
- // Execute the handler. If the handler is _SDPDEC_AcapDecoder itself, recursion occurs.
- if (handler != NULL) {
- (*handler)(token, parse_buffer, (int)hSdpMsg);
- }
- }
- return 1;
- }
2.2 屬性解碼器表格
SipHandler_AttrDecoder
表格包含了屬性名稱與其對應處理常式之間的對應關係。其中「acap」被包含在此表格中,加上
_SDPDEC_AcapDecoder
內的邏輯,便形成了遞迴迴圈
[1]
。
| 索引 | 屬性名稱 | 處理常式位址 (範例) |
|---|---|---|
| 0 | rtpmap | 0x8D0F25C0 |
| 1 | cat | 0x8D0F25CC |
| ... | ... | ... |
| 49 | acap | 0x8D0F280C |
表 1:SipHandler_AttrDecoder 表格節錄,顯示 acap 屬性的對應關係。
3. 記憶體損壞與任務互動
在 Unisoc 數據機韌體中,分配給 SIP 任務的堆疊大小是有限的。每次對
_SDPDEC_AcapDecoder
的遞迴呼叫都會消耗一部分堆疊空間。當一個格式錯誤的 SDP 訊息包含一長串
acap
屬性時,堆疊會增長並超出其邊界。
3.1 堆疊碰撞機制
在 Unisoc RTOS 環境中,任務通常在記憶體中相鄰放置。SIP 任務的堆疊溢位最終會與
sblock_0_2
任務的記憶體空間發生碰撞。此碰撞尤其危險,因為
sblock_0_2
任務負責處理 IMS(IP Multimedia Subsystem)環境中的資料碎片化
[1]
。
圖 1:不受控制的遞迴導致堆疊溢位與任務損壞之流程圖。
3.2 觸發有漏洞的狀態
要成功利用此溢位,
sblock_0_2
任務必須處於活動狀態。研究指出,此任務會在資料碎片化期間被觸發,而攻擊者可透過發送安全即時傳輸協定 (Secure Real-time Transport Protocol, SRTP) 封包來誘發此狀態。攻擊者可向目標裝置發起視訊通話,引發必要的碎片化,並啟動目標任務以供後續損壞
[1]
。
4. 攻擊策略
此攻擊包含兩個主要階段:觸發堆疊溢位,以及控制損壞的記憶體來重導執行流程。
4.1 Payload 建構
概念驗證 (PoC) Payload 利用重複的
acap
屬性序列來驅動遞迴。攻擊者可透過仔細計算重複次數,確保堆疊指標能抵達
sblock_0_2
任務記憶體中的特定位置。
- # Example SDP PoC payload to trigger recursion
- v=0
- o=- 123456 654321 IN IP4 172.22.0.100
- s=Technical Research
- c=IN IP4 172.22.0.100
- t=0 0
- m=video 50000 RTP/AVP 96
- # The following line triggers the uncontrolled recursion
- a=acap:1 acap:1 acap:1 acap:1 acap:1 acap:1 acap:1 acap:1 [repeated] acap:1
4.2 受控資料注入
雖然
acap
屬性觸發了溢位,但像
crypto
等其他屬性可用於在溢位發生前將受控資料(例如 shellcode 或返回位址)放置到堆疊上。此技術允許攻擊者將
sblock_0_2
任務中的函式指標覆寫為指向他們注入的程式碼位址
[1]
。
5. 比較分析與安全影響
Unisoc T612 的漏洞凸顯了嵌入式系統安全中一個反覆出現的主題:在沒有嚴格邊界檢查的情況下信任協定結構所帶來的危險。類似的資料流不安全及輸入清理不足的模式,也曾在其他遠端程式碼執行漏洞中觀察到,例如影響 UniFi OS 的漏洞 [2]。在 UniFi 的案例中,使用者控制的參數直接被注入 shell 指令,這說明了無論是遞迴函式呼叫或是 shell 字串內插,未能驗證「不受信任」的輸入正是多數重大缺陷的根源。
此外,數據機韌體的複雜性使其成為傳統安全審計難以處理的目標。如 SIP 任務與
sblock_0_2
之間的互動,不同 RTOS 任務間的相互作用增加了非確定性,而攻擊者可透過特定的網路條件(如資料碎片化)來利用這些非確定性 [1]。在處理此類漏洞時,靜態應用程式安全測試 (SAST) 可作為第一道防線,在開發階段即識別出缺乏深度限制的遞迴函式,並標記潛在的不安全呼叫模式,從而在程式碼進入正式環境前及早進行修復。
6. 結論
Unisoc T612 數據機韌體中的不受控制遞迴漏洞對行動裝置構成了重大的安全風險。攻擊者可利用
_SDPDEC_AcapDecoder
函式,透過標準蜂巢式信號達成遠端程式碼執行。此研究強調了在所有電信軟體層級中採用防禦性程式設計實務的重要性,包括遞迴深度限制與嚴格的輸入驗證。隨著行動網路向 5G 及更高版本演進,底層數據機韌體的安全性仍然是網路安全領域中的關鍵前沿。