按 Enter 到主內容區
:::

TWCERT-電子報

:::
發布日期:
字型大小:

升級MikroTik路由器作業系統RouterOS,根除overflow後續干擾

CVE編號 CVE-2018-7445
影響產品 RouterOS 6.41.3、6.42rc27之前版本
解決辦法 RouterOS用戶,從QuickSet(System)頁籤 -> 按Check For Updates ->下拉Packages選單,升級所需軟體版本。
張貼日 2018-03-20
上稿單位 TWCERT/CC

●概述:
拉脫維亞網路設備商MikroTik,供應路由器及WIFI設備,以Linux v3.3.5核心為基礎,開發獨立作業系統RouterOS,可安裝於該公司RouterBoard路由器或標準x86平台,具備Firewall、VPN、QoS & Band Management、鏡射監管流量(Port Mirroring)等功能。經分析RouterOS原始碼,解析NetBIOS names之專用函數出現破綻,依序複製資料字串時,未檢查有效邊界,若收到不明人士所創惡意請求訊息,可能導致過量資料塞入目的緩衝區,觸發stack overflow,然攻擊前提須是SMB service正運作中,藉NetBIOS相關屬性探勘始得奏效,鑑於其價格優勢,全球多數國家可見其產品蹤跡,且SMB服務被普遍建置運用以實現應用層資源共享,潛在受災戶具相當規模,MikroTik已升級軟體改善程式缺陷。
●編註:
(1)簡述Server Message Block (SMB)
伺服器訊息區塊(Server Message Block),縮寫SMB,別稱網路檔案分享系統(CIFS:Common Internet File System),初時乃IBM研製,依託NetBIOS協定運行,屬應用層網路傳輸協定,使用port 139、445,以對等的client/server通訊方式,使主機透過網路共享檔案、印表機、串列埠和通訊等資源。
(2)MikroTik RouterOS特定函數buffer overflow瑕疵
本次RouterOS弱點存在前提,是SMB service正處運作狀態,而SMB與NetBIOS關係密切,在處理NetBIOS session請求訊息時,因專用函數parse_names( )設計邏輯僅在”數據全部正確”狀況可正常計算,卻忽略檢查資料有效性的關鍵動作,程式指令碼(經簡化摘列,非原創)示意如下:
int parse_names(char *dst, char *src) {
int len; i; offset;
len = *src;  //取得首字串長度
offset = 0;
while (len) {
for (i = offset; (i - offset) < len; ++i)
{ dst[i] = src[i+1]; }  //自來源buffer逐次複製len個byte長度字串至目的buffer
len = src[i+1];   //取得次組字串長度
if (len) { dst[i] = "."; }  //若len非0,後續仍有資料,填入"."作分隔號
offset = i + 1;   //次字串起始位址
}
dst[offset] = 0;   //字串末以空值結束
return offset;
}
由上段source code可見,parse_names( )函數負責解析NetBIOS名稱,配置兩塊堆疊緩衝區source buffer及destination buffer,source buffer首個byte存放字串長度,在for迴圈中從source buffer第2個byte開始依序複製每一byte內容到destination buffer,if判斷式則根據len變數得知後續是否有資料,據以放置分隔符號,如此循環直到source buffer資料複製到最末,也就是len等於0停止,因為字串長度為0表示沒資料。
然而parse_names( )函數內未見任何檢驗功能,無法保證資料長度能密合目的緩衝區size,正因缺乏邊界檢查,可能發生資料塞進空間不足的緩衝區,衍生stack overflow情況,尤其在原程式設計中,驗證身分安排在解析NetBIOS名稱之後,意味著未受身分稽核之攻擊者,加工送出NetBIOS session request,夾藏惡意格式NetBIOS names,有機會觸發buffer overflow,導致RCE或DoS結果。

回頁首