CVE-2023-4632: 联想系统更新程序中的本地权限提升漏洞
版本: Lenovo Updater Version <= 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定义了一个“执行”操作,提供了“源”和“目标”路径。“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