联想系统更新程序本地权限提升漏洞分析

本文详细分析了CVE-2023-4632漏洞,该漏洞存在于联想系统更新程序中,允许低权限用户通过创建特定目录结构和恶意XML文件实现任意文件写入,最终获得SYSTEM权限。文章包含完整的漏洞利用流程和技术细节。

CVE-2023-4632:联想系统更新程序本地权限提升漏洞

版本:联想更新程序版本 <= 5.08.01.0009
测试操作系统:Windows 10 22H2 (x64)
漏洞:通过任意文件写入实现联想系统更新程序本地权限提升
安全公告:https://support.lenovo.com/us/en/product_security/LEN-135367

漏洞概述

联想系统更新应用程序设计允许非管理员用户检查和应用工作站更新。在检查更新过程中,具有特权的联想更新应用程序尝试使用C:\SSClientCommon\HelloLevel_9_58_00.xml,但该文件在文件系统中不存在。由于任何低权限用户都可以在C盘根目录创建目录,攻击者可以向特权联想系统更新应用程序提供特制的HelloLevel_9_58_00.xml文件,该文件位于C:\SSClientCommon中。

这个自定义XML文件包含源文件和目标文件路径,当用户检查更新时,联想系统更新应用程序会解析这些路径。解析后,特权联想系统更新应用程序将源文件移动到目标位置,允许任意文件写入原语,从而导致权限提升至NT AUTHORITY\SYSTEM。

漏洞详细分析

当用户通过联想系统更新应用程序检查联想更新时,Tvsukernel.exe以Lenovo_tmp_<随机字符>用户身份在高完整性上下文中启动。执行时,Tvsukernel.exe检查C:\SSClientCommon中的HelloLevel_9_58_00.xml,如图01所示。

图01 - 缺失的目录和XML文件

默认情况下,所有版本的Windows都允许低权限用户在C盘根目录创建目录。攻击者可以手动创建C:\SSClientCommon\目录,然后将HelloLevel_9_58_00.xml放入其中,如图02所示。

图02 - 在C盘根目录创建目录和XML

创建C:\SSClientCommon后,攻击者可以创建所需的子目录C:\SSClientCommon\UTS,该目录将包含攻击者的恶意二进制文件。攻击的目录结构类似于下面的图03:

图03:最终文件夹和文件结构

由于HelloLevel_9_58_00.xml位于攻击者可以控制的位置,因此可以制作自定义XML文件,允许攻击者将文件从一个位置移动到另一个位置。这是可能的,因为自定义XML定义了"execute"操作,提供"Source"和"Destination"路径。“SourcePath"元素定义了位于C:\SSClientCommon\UTS中的可移植可执行(PE)文件 - 在本例中为C:\SSClientCommon\UTS\poc2.exe。

“DestinationPath"节点定义了源文件要复制到的位置,如图04所示:

图04 - 自定义XML源和目标路径

联想系统更新应用程序启动并检查更新后,特权进程(即Tvsukernel.exe)检查C:\SSClientCommon\HelloLevel_9_58_00.xml是否存在。由于路径已创建并植入了自定义XML文件,Tvsukernel.exe将自定义HelloLevel_9_58_00.xml文件移动到C:\ProgramData\Lenovo\SystemUpdate\sessionSE\system\SSClientCommon\HelloLevel_9_58_00.xml,如图05所示:

图05:将自定义XML写入ProgramData

移动XML文件后,Tvsukernel.exe调用Client.dll中的ParseUDF()函数来解析位于C:\ProgramData\Lenovo\SystemUpdate\sessionSE\system\SSClientCommon\HelloLevel_9_58_00.xml的XML文件。当Tvsukernel.exe解析XML时,它会将XML中包含的DestinationPath前缀加上C:\ProgramData\Lenovo\SystemUpdate\sessionSE\,如图06所示:

图06:ParseUDF()中的XML解析

在攻击者控制的自定义XML文件中,可以使用目录遍历来突破替换的C:\ProgramData\Lenovo\SystemUpdate\sessionSE\ DestinationPath值。攻击者可以利用此功能选择操作系统上的任何位置,从而导致任意文件写入原语。在这种情况下,使用目录遍历将DestinationPath值设置为C:\Program Files (x86)\Lenovo\System Update\SUService.exe,如图07所示。这是因为联想更新程序每次启动时都会尝试以NT AUTHORITY\SYSTEM身份启动此应用程序。

图07:自定义XML中的目录遍历

创建自定义XML并将其放置在C:\SSClientCommon\HelloLevel_9_58_00.xml中,并将恶意二进制文件放置在C:\SSClientCommon\UTS\poc2.exe中后,攻击者只需打开联想系统更新应用程序并检查更新即可。执行时,Tvsukernel.exe将恶意C:\SSClientCommon\HelloLevel_9_58_00.xml移动到C:\ProgramData\Lenovo\SystemUpdate\sessionSE\system\SSClientCommon\HelloLevel_9_58_00.xml,解析它,然后将C:\SSClientCommon\UTS\poc2.exe移动到C:\Program Files (x86)\Lenovo\System Update\SUService.exe;覆盖SUService.exe二进制文件,如图08所示:

图08:覆盖联想SUService.exe服务二进制文件

当联想的SUService.exe二进制文件被自定义应用程序覆盖后,攻击者可以关闭并重新打开联想系统更新应用程序,这将导致攻击者的应用程序以NT AUTHORITY\SYSTEM身份执行。在这种情况下,poc2.exe获取当前执行用户的用户名并将其写入C:\Windows\POCOutput.txt,如图09所示:

图09:以NT AUTHORITY\SYSTEM身份执行代码

此漏洞已在最新版本的联想系统更新程序应用程序中修复。

联想的安全公告可以在此处找到:https://support.lenovo.com/us/en/product_security/LEN-135367

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计