漏洞概述
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_ROOT\ksoqing\shell\open\command,其内容为"C:\Users\【用户名】\AppData\Local\Kingsoft\WPS Office\12.2.0.13110\office6\wps.exe" /qingbangong "%1"。即访问以ksoqing 开头的URL协议时,将启动wps.exe程序,并传递/qingbangong参数,%1则被替换为以ksoqing 开头的协议链接,一并作为wps启动的参数。
此时wps.exe程序解析参数/qingbangong,并将ksoqing链接内容一并发送到 C:\Users\【用户名】\AppData\Local\Kingsoft\WPS Office\12.2.0.13110\office6\wpscloudsvr.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目录下的wps\INetCache目录中。
下载后的文件名,使用的是下载链接(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://www.welivesecurity.com/en/eset-research/analysis-of-two-arbitrary-code-execution-vulnerabilities-affecting-wps-office/
https://nvd.nist.gov/vuln/detail/CVE-2024-7262
https://avd.aliyun.com/detail?id=AVD-2024-7262