联想系统更新本地权限提升漏洞CVE-2023-4632深度分析

本文详细分析了联想系统更新应用中的一个本地权限提升漏洞。该漏洞允许低权限用户通过创建特定目录和恶意XML文件,诱导高权限进程执行任意文件写入操作,最终获得SYSTEM权限执行代码。文章包含详细的漏洞原理和复现步骤。

版本: Lenovo Updater 版本 <= 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_<随机字符> 的身份在一个高完整性(High Integrity)的上下文中启动。执行后,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.exeDestinationPath 节点定义了源文件要被复制到的目标位置,如图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 值设置为 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 设计