跳到主要内容

CustomAction

CustomAction(自定义操作)是 Windows Installer 为 MSI 安装包提供的扩展机制。标准 MSI 表可以描述复制文件、写注册表、创建快捷方式和注册服务等常规安装动作;遇到产品特有逻辑时,安装包可以登记一段额外代码,由 Windows Installer 在安装事务的特定阶段调用。

先说结论:

CustomAction 是合法安装能力
恶意 MSI 可以滥用它执行任意安装外逻辑
当 DLL 型 CustomAction 被进程内加载时
行为主体在日志里可能直接显示为 msiexec.exe

这与“攻击者向 msiexec.exe 注入代码”不是一回事。

组成

MSI 本质上是一个带有关系表的安装数据库。和 CustomAction 分析最相关的对象包括:

  • CustomAction 表:定义动作类型、代码来源、入口和参数。
  • InstallExecuteSequence / InstallUISequence:决定动作在哪个阶段、满足什么条件时运行。
  • Binary 表或已安装文件:可保存 DLL、脚本或其他动作内容。
  • 安装属性:在前端、服务端和延迟执行阶段传递状态。

CustomAction 可以承载 DLL 导出函数、可执行文件、脚本、命令或其他安装扩展。具体能力、位数、上下文和回滚语义由动作类型与调度属性共同决定。

执行阶段

Immediate

立即动作通常在安装器生成执行计划时运行,可以读取和修改部分 MSI 属性。它更接近“决定后面要做什么”,不应默认理解为具备完整系统权限。

Deferred

延迟动作在执行脚本阶段运行,用于真正改变系统。它能访问的安装会话信息更受限制,通常通过专门属性接收必要数据。

Rollback 与 Commit

回滚动作在安装失败时撤销变化,提交动作则在事务即将成功结束时执行。恶意包可能把行为分散到不同阶段,导致只观察一个时间点时漏掉关键动作。

Impersonated 与 NoImpersonate

动作是否模拟发起安装的用户,决定了它以用户上下文还是安装服务的高权限上下文运行。高权限并不是 CustomAction 自动拥有的:它取决于安装方式、包策略、系统配置和动作调度。

注意

不要看到 msiexec.exe 就直接写“以 SYSTEM 执行”。Windows Installer 存在前端、服务端和自定义操作宿主等不同角色,必须用进程树、令牌、命令行和事件日志确认实际上下文。

in-process 寄生

DLL 型 CustomAction 可以由 Windows Installer 的宿主进程加载,然后调用包中登记的入口。对于防守方来说,最关键的现象是:

MSI 提供 DLL 内容与调度信息

Windows Installer 选择相应宿主

宿主把 DLL 加载进自己的地址空间

DLL 代码以宿主进程身份执行

不同版本、位数、动作类型和隔离策略可能让代码出现在某个 msiexec.exe 实例或专门的自定义操作宿主中。分析时不应先假设固定 PID 或固定父子关系,而要根据模块加载和安装日志定位。

为什么不是注入

维度跨进程注入DLL CustomAction in-process
内容进入方式外部进程向目标地址空间写入或映射宿主按照 MSI 元数据主动加载
常见触发远程线程、APC、线程劫持Windows Installer 调用登记入口
典型证据跨进程句柄、写内存、异常线程起点MSI 表、安装日志、临时 DLL、模块加载
日志主体注入者与目标可分开恶意行为可能直接归到安装宿主

因此,“合法 msiexec.exe 在截屏或联网”不能自动推导出“msiexec 被注入”。在缺少跨进程原语时,应优先检查 CustomAction、脚本动作、子进程代理执行以及其他进程内加载机制。

恶意用法

恶意 MSI 可以把载荷嵌在包内,也可以只放一个下载或解码阶段。CustomAction 被调用后,可能完成主机侦察、持久化、外部通信、凭据访问或释放后续模块。

它的隐蔽性主要来自信任错配:

  • msiexec.exe 是微软签名的系统程序。
  • 安装行为天然会产生大量文件、注册表和服务变化。
  • 企业环境中常见软件部署会使用 MSI,形成较高噪声。
  • 进程内 CustomAction 不需要跨进程写入,因此传统注入规则可能没有事件。
  • 如果检测产品把宿主签名继承为模块信誉,恶意 DLL 的行为可能被错误降权。

真正应该被信任的是“已批准的软件包 + 可验证发布者 + 合理来源 + 符合预期的安装行为”,而不是 msiexec.exe 这个进程名。

抽象案例

某个来自网络下载目录的 MSI 被用户启动。进程树只显示正常的 Windows Installer 前端和服务端实例,没有明显脚本解释器,也没有远程线程事件。但在安装期间,某个安装宿主出现了:

  • 从安装临时目录加载随机名称 DLL。
  • 访问输入设备或屏幕相关 API。
  • 读取主机与用户信息。
  • 连接与软件厂商无关的公网基础设施。
  • 安装结束后仍留下自启动入口或额外载荷。

进一步检查 MSI 数据库发现,一个 DLL 型 CustomAction 在执行序列中被调度,内容来自包内二进制流。此时可以把机制写成“恶意 DLL 通过 MSI CustomAction 被安装宿主进程内加载”,而不是泛化成“注入 msiexec”。

分析方法

静态检查 MSI

在隔离环境中导出或查看 MSI 表,重点回答:

  1. 存在哪些 CustomAction,类型、来源和目标是什么。
  2. 它们出现在 UI 序列还是执行序列,条件是什么。
  3. 是否为延迟、回滚、提交或高权限动作。
  4. 内容来自 Binary 表、包内文件、已安装文件还是外部路径。
  5. 动作名称、入口、厂商说明与实际功能是否一致。
  6. 包签名、发布者、下载来源和产品元数据能否相互印证。

静态存在 CustomAction 不等于恶意。许多驱动、数据库、浏览器、办公和企业软件确实需要定制安装逻辑,关键是来源、动作内容和行为是否合理。

动态关联

以安装开始和结束时间为边界,同时收集:

  • msiexec.exe 各实例的父子关系、命令行、用户、完整性级别和位数。
  • Windows Installer 详细日志与相关事件日志。
  • 安装临时目录中的 DLL、脚本和释放文件。
  • 模块加载,尤其是用户可写或临时路径。
  • 安装宿主的文件、注册表、服务、计划任务、网络和敏感 API 行为。
  • 安装结束后的残留进程与持久化。

如果安全执行环境允许,可对 MSI 做受控动态分析;不要在生产主机上为了验证而直接安装未知包。

检测

来源与身份

  • MSI 来自浏览器下载、即时通信、邮件附件或用户可写共享。
  • 包未签名、签名无效,或发布者与软件品牌、下载域名不一致。
  • 临时目录中的 MSI 被静默安装,且缺少企业部署父进程。
  • 产品名、厂商名和安装路径模仿常见软件,但哈希不在批准基线中。

进程与模块

  • msiexec.exe 从临时目录加载未签名或低信誉 DLL。
  • 安装宿主加载随机名 .tmp / .dll,随后马上执行敏感行为。
  • 前端、服务端和自定义操作宿主之间的角色与企业常见基线不符。
  • 安装期间派生脚本解释器、命令解释器或其他代理执行程序。

“负向行为画像”

合法安装可以下载组件,也会写大量系统配置,所以单一网络或注册表事件误报较高。更强的信号是 msiexec 或其 CustomAction 宿主执行与安装职责明显无关的动作,例如:

  • 键盘状态、剪贴板、屏幕或摄像头访问。
  • 浏览器凭据、认证进程、敏感令牌或跨用户数据访问。
  • 与产品更新基础设施无关的长期心跳通信。
  • 安装完成后继续驻留并周期性联网。
  • 主动削弱安全产品、审计、更新或防火墙。

证据分层

写分析结论时应区分:

  • 行为证据msiexec 或相关宿主实际做了哪些异常操作。
  • 机制证据:MSI 表、安装日志或模块事件是否证明 CustomAction 被调用。
  • 上下文证据:包从哪里来、谁启动、以什么令牌执行、发布者是否可信。

只有异常行为、没有 MSI 结构和模块证据时,可以写“疑似进程内 CustomAction 或其他安装扩展”,不应把推断当成铁证。

缓解

  • 企业软件部署只允许来自受管仓库、可信发布者和批准哈希的 MSI。
  • 对来自互联网的 MSI 启用应用控制、信誉检查和受控安装流程。
  • 记录 Windows Installer 详细日志,并将日志集中转发,避免只留在终端。
  • msiexec 保留模块加载、网络与敏感行为监控,不因微软签名自动放行。
  • 将安装临时目录、用户可写目录和随机名 DLL 纳入模块扫描。
  • 对高权限安装实施最小权限和变更审批,限制普通用户任意触发高权限安装。

ATT&CK 对照

Technique适用含义
T1218.007 Msiexec利用 msiexec 代理执行恶意 MSI 或远程包
T1204 User Execution诱导用户启动安装包
T1547 / T1053 等CustomAction 后续建立的具体持久化,应按实际落点标注
T1055 Process Injection只有存在真正跨进程注入证据时才使用;in-process CustomAction 本身不属于注入

小结

CustomAction 是 MSI 的合法扩展点。恶意包的关键滥用方式,是让 Windows Installer 按包内定义主动加载和执行攻击者控制的逻辑。DLL 型动作在进程内运行时,日志主体可能显示为合法签名的安装宿主,但这不代表微软签名替 DLL 或 MSI 背书。

分析时最重要的三句话是:

msiexec 是执行宿主,不是行为信誉的来源
进程内 CustomAction 不等于跨进程注入
必须把 MSI 结构、模块加载和异常行为关联起来