背景
在2023年8月23日,Group-IB威脅情報(bào)機(jī)構(gòu)發(fā)布了一份報(bào)告,詳細(xì)介紹了WinRAR任意執(zhí)行漏洞CVE-2023-38831的攻擊活動(dòng)。根據(jù)該報(bào)告,這個(gè)漏洞最早于2023年4月被攻擊者利用,然后在2023年7月被Group-IB威脅情報(bào)機(jī)構(gòu)發(fā)現(xiàn)并報(bào)告給了RARLAB。最終,RARLAB在2023年8月2日發(fā)布了修復(fù)了CVE-2023-38831漏洞的正式版本W(wǎng)inRAR v6.23。
漏洞簡(jiǎn)介
本次漏洞影響范圍為低于WinRAR v6.23的所有版本,以下是該漏洞的基本信息:
(圖源:WinRAR代碼執(zhí)行漏洞 (CVE-2023-38831) 安全風(fēng)險(xiǎn)通告 - 安全內(nèi)參 | 決策者的網(wǎng)絡(luò)安全知識(shí)庫(kù) (secrss.com))
WinRAR是一款功能強(qiáng)大的Windows文件壓縮和解壓縮工具,支持高效的壓縮算法、密碼保護(hù)、分卷壓縮、恢復(fù)記錄等功能,同時(shí)提供圖形和命令行界面,以及自解壓縮功能,為用戶(hù)提供便捷且安全的文件管理和傳輸工具。
在zip文件格式中,使用了ZIPDIRENTRY結(jié)構(gòu)體來(lái)管理壓縮包內(nèi)的文件和文件夾信息,包括名稱(chēng)、名稱(chēng)長(zhǎng)度和修改日期等。WinRAR允許用戶(hù)預(yù)覽和執(zhí)行壓縮包內(nèi)文件。但由于字符串比較代碼的問(wèn)題,當(dāng)用戶(hù)打開(kāi)zip壓縮包并執(zhí)行文件時(shí),WinRAR可能會(huì)錯(cuò)誤地釋放非用戶(hù)所選的文件。
WinRAR使用了ShellExecuteExW來(lái)啟動(dòng)目標(biāo)文件,這是Windows系統(tǒng)的一個(gè)API函數(shù),用于執(zhí)行目標(biāo)文件操作。然而,當(dāng)文件路徑字符串末尾存在空格時(shí),該API會(huì)在路徑末尾添加通配符“.*”并搜索匹配的文件來(lái)執(zhí)行,導(dǎo)致了非目標(biāo)文件的執(zhí)行。
綜上所述,這個(gè)漏洞的觸發(fā)包含兩個(gè)環(huán)節(jié):
a.文件釋放:由于文件名字符串的比較函數(shù)存在一定的問(wèn)題,導(dǎo)致了非目標(biāo)文件被釋放;
b.文件執(zhí)行:釋放的文件經(jīng)ShellExecuteExW執(zhí)行,當(dāng)路徑字符串末尾有空格時(shí),可能會(huì)導(dǎo)致路徑下其他特定文件的執(zhí)行。
- 漏洞詳細(xì)分析
以WinRAR v6.11(x64)為例,分析漏洞的實(shí)現(xiàn)原理和過(guò)程。
ZIP文件采用了三種數(shù)據(jù)結(jié)構(gòu)來(lái)有效管理壓縮包內(nèi)的文件內(nèi)容:ZIPFILERECORD, ZIPDIRENTRY,ZIPENDLOCATOR,其中ZIPDIRENTRY在本次漏洞觸發(fā)中扮演了關(guān)鍵的角色。在zip壓縮包內(nèi),每個(gè)文件和文件夾都對(duì)應(yīng)了一個(gè)ZIPDIRENTRY數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)包含一個(gè)名為deFileName的成員,用于存儲(chǔ)目標(biāo)文件/文件夾的名稱(chēng)。
構(gòu)建一個(gè)zip格式的壓縮包,源文件如圖:
打包為zip后數(shù)據(jù)結(jié)構(gòu)如圖,圖中的ZIPDIRENTRY dirEntry是我們要重點(diǎn)關(guān)注的對(duì)象,這個(gè)數(shù)據(jù)結(jié)構(gòu)下有個(gè)deFileName,指的是這個(gè)結(jié)構(gòu)體管理的目標(biāo)文件的文件名:
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-710158.html
用WinRAR打開(kāi)這個(gè)壓縮包,執(zhí)行test_.txt,可以看到WinRAR在temp目錄下釋放了該文件:
?
? WinRAR釋放目標(biāo)文件的邏輯是這樣的:
文件釋放漏洞
紅色部分是觸發(fā)漏洞的關(guān)鍵點(diǎn)一,通過(guò)各種逆向分析手段,找到了該處代碼:
? 根據(jù)這處代碼的邏輯,如果我們要解壓的文件為test_.txt,那么就會(huì)有三種類(lèi)型的字符串被匹配上:“test_.txt”、“test_.txt\*”、“test_.txt/*”,這里的*表示任意字符串,例如“test_.txt\a.exe”。
所以,我們對(duì)之前構(gòu)造的壓縮包稍作修改:
?然后執(zhí)行test_.txt,就會(huì)發(fā)現(xiàn),WinRAR偷偷釋放了我們不需要的文件:
?
至此,文件釋放的漏洞解釋完畢,接下來(lái)是文件執(zhí)行。
文件執(zhí)行漏洞
WinRAR使用API執(zhí)行文件:ShellExecuteExW,這是shell32.dll導(dǎo)出的一個(gè)函數(shù),該API的執(zhí)行邏輯大致如下:
? 圖中標(biāo)紅的函數(shù)CShellExecute::_PerformantBindCtx就是本次漏洞的關(guān)鍵點(diǎn)二,文件執(zhí)行。
依舊是使用各種逆向分析手段定位到該函數(shù):
? 其中有兩個(gè)關(guān)鍵函數(shù)PathFindExtensionW和sub_180206AE0:
PathFindExtensionW是KernelBase.dll的一個(gè)導(dǎo)出函數(shù),用于從一個(gè)文件名中提取出擴(kuò)展名所在位置的字符串指針,如傳入?yún)?shù)為“C:\Windows\test.exe”時(shí),返回值為指向這個(gè)字符串的“.exe”位置的指針,這個(gè)函數(shù)的代碼是這樣的:
可以看到它調(diào)用了另一個(gè)函數(shù)PathCchFindExtension,這個(gè)子函數(shù)才是提取擴(kuò)展名字符串的關(guān)鍵函數(shù),代碼邏輯也很簡(jiǎn)單,遍歷文件路徑字符串,查找末尾“.*”的位置。
需要注意的是,windows下的文件名稱(chēng)本身(不包括路徑),是不可以含有正反斜杠和空格的。
但我們只是在調(diào)用API,我們可以給它傳任意參數(shù),比如說(shuō)"C:\Windows\test.exe ",注意這里test.exe后面有個(gè)空格,那么這時(shí)會(huì)發(fā)生什么呢?
PathCchFindExtension返回給PathFindExtensionW一個(gè)指向了0的字符串,PathFindExtensionW又把這個(gè)指針?lè)祷亟oCShellExecute::_PerformantBindCtx,
? 然后就會(huì)導(dǎo)致函數(shù)sub_180206AE0被執(zhí)行,這個(gè)函數(shù)就負(fù)責(zé)給文件名加上通配符,然后在路徑下查找匹配的文件:
- ?漏洞完整驗(yàn)證
至此我們已經(jīng)把漏洞的兩個(gè)關(guān)鍵環(huán)節(jié)都找到了,只要根據(jù)上面分析的結(jié)果構(gòu)造一個(gè)特殊的zip文件,就可以觸發(fā)這個(gè)漏洞:
? ? ?圖中標(biāo)紅位置的字符串,在.txt后面都跟著一個(gè)空格。
然后我們執(zhí)行一下:
當(dāng)當(dāng)~驗(yàn)證完畢。
注:
此處使用的WinRAR版本為6.11中文版,64位;
由于系統(tǒng)dll版本的不同,上述API的執(zhí)行情況可能有所差別,請(qǐng)根據(jù)實(shí)際情況進(jìn)行分析;
閑暇之余隨手寫(xiě)的文章,行文格式很隨意,看不懂的地方還請(qǐng)多看兩遍(doge);
文章中最后poc演示的zip文件下載鏈接:
https://drive.google.com/file/d/1MTDv5snH7ca1Y7lQXEj9_3vmKM8bjpXp/view?usp=drive_link
參考鏈接:
WinRAR代碼執(zhí)行漏洞 (CVE-2023-38831) 安全風(fēng)險(xiǎn)通告 - 安全內(nèi)參 | 決策者的網(wǎng)絡(luò)安全知識(shí)庫(kù) (secrss.com)
Konni APT 利用 WinRAR 漏洞(CVE-2023-38831)攻擊數(shù)字貨幣行業(yè) (seebug.org)
CVE-2023-38831 WinRAR 漏洞分析 (seebug.org)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-710158.html
?
到了這里,關(guān)于Winrar代碼執(zhí)行漏洞(CVE-2023-38831)的原理分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!