漏洞概述
WPS Office 程序 promecefpluginhost.exe 存在不當路徑驗證問題,允許攻擊者在 Windows 上加載任意 Windows 庫文件。該漏洞已被 APT-C-60 攻擊者利用,當用戶打開 MHTML 格式的文檔時,隻需單擊一個惡意制作的超鏈接,即可執行攻擊者指定的惡意庫文件,實現遠程代碼執行。
影響範圍
WPS Office 版本 12.2.0.13110-12.2.0.16412
複現環境
操作系統:Win10 10.0.18363.592 WPS Office 版本:WPS Office 12.2.0.13110
分析過程
WPS 程序安裝後注冊了一個名爲 ksoqing 的自定義 URL 協議,注冊表路徑爲:計算機 HKEY_CLASSES_ROOTksoqingshellopencommand,其内容爲 "C:Users【用戶名】AppDataLocalKingsoftWPS Office12.2.0.13110office6wps.exe" /qingbangong "%1"。即訪問以 ksoqing 開頭的 URL 協議時,将啓動 wps.exe 程序,并傳遞 /qingbangong 參數,%1 則被替換爲以 ksoqing 開頭的協議鏈接,一并作爲 wps 啓動的參數。
此時 wps.exe 程序解析參數 /qingbangong,并将 ksoqing 鏈接内容一并發送到 C:Users【用戶名】AppDataLocalKingsoftWPS Office12.2.0.13110office6wpscloudsvr.exe
wpscloudsvr.exe 中的 qingbangong.dll 解析自定義 URL 鏈接内容。當 type 參數爲 ksolaunch 時,将啓動 launchname 參數指定的程序,參數使用 base64 編碼。
launchname 參數指定的程序啓動時,wpscloudsvr.exe 會将 URL 鏈接中的 cmd 參數使用 base64 解碼,然後傳遞給它。
如果 launchname 參數指定的是 promecefpluginhost.exe,該程序啓動後,将加載 ksojscore.dll,然後解析命令行中的 -JSCefServicePath。
這個參數可以指定一個文件名,這個文件會被 kso_qt::QLibrary::load 函數加載到内存執行。默認情況下,如果隻是指定一個文件名,會按照 DLL 搜索順序搜索和加載這個文件,比如加載同 EXE 目錄下指定的 DLL 文件。但是這個參數未做任何過濾,可以指定 ".." 包含目錄的路徑,存在路徑穿越漏洞,可以加載任意指定的 DLL 文件,最終實現任意代碼執行。
使用路徑穿越的漏洞可以加載指定 DLL 文件,但這還不夠。APT-C-60 攻擊者使用 MHTML 格式的 xls 電子表格文件,利用其特性,實現下載遠程 DLL 文件的目的。WPS 支持 MHTML 格式的文檔,這種文檔可以包含 HTML、CSS 和 JavaScript 等文件,方便在浏覽器中顯示文檔。
文檔中可以使用 img 标簽,指定遠程 DLL 文件。
當文檔被打開時,wps 使用 _XUrlDownloadToCacheFile 函數下載文件到 temp 目錄下的 wpsINetCache 目錄中。
下載後的文件名,使用的是下載鏈接(UNICODE 編碼)的 MD5 值。
最終配合上述路徑穿越漏洞,在 -JSCefServicePath 參數中指定下載的文件名,實現遠程代碼執行。這裏還有一個小技巧,因爲下載後的文件名并沒有 .dll 後綴,而在加載的時候如果沒有指定 .dll 後綴,會自動補上該後綴再加載。爲了避免在加載的時候找不到指定文件導緻失敗,在 -JSCefServicePath 參數中指定下載的文件名時,需要在文件名最後額外加個 "."。
漏洞複現
新建 xls 格式的文檔,添加超鏈接,超鏈接可任意,并另存爲 MHTML 格式的文檔。
根據遠程 DLL 的下載鏈接,使用 poc.py 計算下載後的文件名,并最終生成 ksoqing 協議鏈接。
将 ksoqing 鏈接替換導出的 MHTML 格式文檔中的超鏈接。
再根據遠程 DLL 的下載鏈接,添加 img 标簽,實現遠程下載 DLL 文件。
開啓遠程 DLL 下載服務,然後打開 MHTML 文檔,點擊超鏈接,觸發漏洞。
參考鏈接
ddpoc 鏈接:
https://www.ddpoc.com/DVB-2024-8279.html
https://nvd.nist.gov/vuln/detail/CVE-2024-7262