Windows Installer自定义动作权限提升漏洞深度剖析

本文详细分析了Windows Installer服务中自定义动作的安全漏洞,展示了攻击者如何通过环境变量污染实现本地权限提升。文章包含完整的PoC示例和漏洞复现步骤,涉及CVE-2023-21800等历史漏洞关联分析。

Windows Installer:利用自定义动作实现权限提升

一年前,我发布了关于Windows Installer服务的研究成果。该文章详细解释了MSI修复过程如何在提升的上下文中执行,但缺乏模拟可能导致任意文件删除和类似问题。微软承认了该问题(CVE-2023-21800),但从未直接修复。相反,重定向保护机制的引入缓解了msiexec进程上下文中的所有符号链接攻击。当时,我对这个解决方案并不满意,但找不到任何绕过方法。

重定向保护确实按预期工作,因此我花时间从其他角度攻击Windows Installer服务。虽然发现了一些漏洞(CVE-2023-32016),但我始终认为微软处理模拟问题的方式并不完全正确。这种未修复的行为在后续研究中变得非常有用。

自定义动作详解

在Windows Installer领域,自定义动作是用户定义的动作,用于扩展安装过程的功能。当Windows Installer的内置功能不足时,自定义动作变得必要。例如,如果应用程序需要根据用户环境动态设置特定注册表项,可以使用自定义动作实现。另一个常见用例是当安装程序需要执行复杂任务时,例如标准MSI动作无法处理的自定义验证或与其他软件组件的交互。

自定义动作可以通过不同方式实现:

  • 使用公开的C/C++ API编译为自定义DLL
  • 在WSX文件中内联VBScript或JScript代码片段
  • 在WSX文件中显式调用系统命令

为简化说明,我们将重点讨论最后一种类型。

漏洞复现实战

以下示例WSX文件(poc.wsx)包含一些自定义动作:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="{12345678-9259-4E29-91EA-8F8646930000}" Language="1033" Manufacturer="YourCompany" Name="HelloInstaller" UpgradeCode="{12345678-9259-4E29-91EA-8F8646930001}" Version="1.0.0.0">
        <Package Comments="This installer database contains the logic and data required to install HelloInstaller." Compressed="yes" Description="HelloInstaller" InstallerVersion="200" Languages="1033" Manufacturer="YourCompany" Platform="x86" ReadOnly="no" />

        <CustomAction Id="SetRunCommand" Property="RunCommand" Value="&quot;[%USERPROFILE]\test.exe&quot;" Execute="immediate" />
        <CustomAction Id="RunCommand" BinaryKey="WixCA" DllEntry="WixQuietExec64" Execute="commit" Return="ignore" Impersonate="no" />
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLFOLDER" Name="HelloInstaller" ShortName="krp6fjyg">
                    <Component Id="ApplicationShortcut" Guid="{12345678-9259-4E29-91EA-8F8646930002}" KeyPath="yes">
                        <CreateFolder Directory="INSTALLFOLDER" />
                    </Component>
                </Directory>
            </Directory>
        </Directory>
        <Property Id="ALLUSERS" Value="1" />
        <Feature Id="ProductFeature" Level="1" Title="Main Feature">
            <ComponentRef Id="ApplicationShortcut" />
        </Feature>
        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." Schedule="afterInstallValidate" />

        <InstallExecuteSequence>
            <Custom Action="SetRunCommand" After="InstallInitialize">1</Custom>
            <Custom Action="RunCommand" After="SetRunCommand">1</Custom>
        </InstallExecuteSequence>
    </Product>
</Wix>

这个WSX文件定义了InstallExecuteSequence,包含两个自定义动作。SetRunCommand在InstallInitialize事件之后排队运行,然后RunCommand在SetRunCommand完成后启动。

SetRunCommand动作设置RunCommand属性的值。[%USERPROFILE]字符串将扩展为当前用户配置文件目录的路径。第二个动作RunCommand使用RunCommand属性并通过调用WixQuietExec64方法执行它。Impersonate=“no"选项使命令能够以LocalSystem的完整权限执行。

攻击原理分析

在修复操作中,msiexec.exe可以由标准用户启动,同时自动提升其权限以执行某些动作,包括MSI文件中定义的各种自定义动作。值得注意的是,并非所有自定义动作都以提升的权限执行。具体来说,动作必须显式标记为Impersonate=“no”,安排在InstallExecuteSequence和InstallFinalize事件之间,并使用commit、rollback或deferred作为执行类型才能以提升权限运行。

提升的自定义动作可能使用环境变量和Windows Installer属性。标准用户调用修复过程时可以"污染"以下属性:

  • “AdminToolsFolder”
  • “AppDataFolder”
  • “DesktopFolder”
  • “FavoritesFolder”
  • “LocalAppDataFolder”
  • “MyPicturesFolder”
  • “NetHoodFolder”
  • “PersonalFolder”
  • “PrintHoodFolder”
  • “ProgramMenuFolder”
  • “RecentFolder”
  • “SendToFolder”
  • “StartMenuFolder”
  • “StartupFolder”
  • “TempFolder”
  • “TemplateFolder”

此外,软件安装程序经常使用以下环境变量:

  • “APPDATA”
  • “HomePath”
  • “LOCALAPPDATA”
  • “TEMP”
  • “TMP”
  • “USERPROFILE”

漏洞影响评估

当低权限用户触发修复过程时,虽然使用用户的环墶设置可执行路径,但命令仍以系统级完整性执行,没有任何用户模拟!这导致直接的权限提升。

披露时间线

日期 状态
2023年12月1日 向微软安全响应中心报告漏洞
2024年2月9日 请求补充详细信息
2024年2月9日 提供补充详细信息
2024年5月9日 问题被关闭,标记为不可复现

截至目前,该问题仍未修复。我们确认它影响当前最新的Windows Insider Preview版本10.0.25120.751。

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