.NET高级代码审计(第五课).NET Remoting反序列化漏洞
字数 2362 2025-08-18 11:38:21

.NET Remoting反序列化漏洞分析与复现

一、漏洞概述

.NET Remoting应用程序在特定配置下存在反序列化安全风险,当服务端使用HTTP信道中的SoapServerFormatterSinkProvider类作为信道接收器,并且将TypeFilterLevel属性设置为Full时,攻击者可以利用反序列化漏洞实现远程代码执行(RCE)。

二、.NET Remoting基础概念

2.1 基本定义

.NET Remoting是一种分布式应用解决方案,允许不同AppDomain(应用程序域)之间进行通信,通信可以发生在:

  • 同一进程中的不同AppDomain
  • 同一系统中的不同进程

2.2 信道类型

.NET Remoting提供三种信道类型:

  1. IpcChannel

    • 使用Windows进程间通信(IPC)系统
    • 仅限同一计算机上的应用程序域之间通信
    • 比TCP或HTTP信道更快
  2. TcpChannel

    • 基于Socket传输
    • 默认使用二进制格式序列化
    • 适用于局域网,传输性能高
  3. HttpChannel

    • 使用HTTP协议传输
    • 使用SOAP格式序列化
    • 适用于广域网,可穿透防火墙

三、漏洞原理分析

3.1 关键组件

  1. SoapServerFormatterSinkProvider

    • 实现IServerChannelSinkProvider接口
    • 使用SoapFormatter格式化器序列化对象
    • 包含关键属性TypeFilterLevel
  2. TypeFilterLevel属性

    • Low(默认):仅支持基本远程处理功能相关类型
    • Full:支持所有类型,存在安全风险

3.2 攻击条件

服务端配置必须满足以下条件之一:

  1. 使用HttpServerChannel并传入SoapServerFormatterSinkProvider(TypeFilterLevel=Full)

    • public HttpServerChannel(IDictionary properties, IServerChannelSinkProvider sinkProvider)
    • public HttpServerChannel(string name, int port, IServerChannelSinkProvider sinkProvider)
  2. 使用HttpChannel并传入SoapServerFormatterSinkProvider(TypeFilterLevel=Full)

    • public HttpChannel(IDictionary properties, IClientChannelSinkProvider clientSinkProvider, IServerChannelSinkProvider serverSinkProvider)

四、漏洞利用

4.1 利用链

利用Microsoft.VisualStudio.Text.Formatting.TextFormattingRunProperties类:

  • 实现了ISerializable接口
  • 包含ForegroundBrush属性支持XAML数据
  • 存在于Microsoft.VisualStudio.Text.UI.Wpf.dll或Microsoft.PowerShell.Editor.dll中

4.2 攻击载荷构造

SOAP消息格式示例:

<a1:TextFormattingRunProperties xmlns:a1="http://schemas.microsoft.com/2003/10/Serialization/">
  <ForegroundBrush xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <ResourceDictionary>
      <!-- XAML恶意代码 -->
    </ResourceDictionary>
  </ForegroundBrush>
</a1:TextFormattingRunProperties>

4.3 攻击请求特征

  1. 请求方法:

    • 常规POST
    • 或M-POST(强制POST)
  2. 请求头:

    • 必须包含SOAPAction头
    • 值可以是任意URI
  3. 请求URI:

    • 通常以.rem为扩展名
    • IIS默认使用IsapiModule处理.rem请求

五、漏洞复现

5.1 环境搭建

  1. 创建服务端:

    • 使用HttpChannel或HttpServerChannel
    • 配置SoapServerFormatterSinkProvider(TypeFilterLevel.Full)
    • 绑定端口(如1234)
  2. 创建远程对象:

    • 继承MarshalByRefObject
    • 使用WellKnown激活模式(SingleTon或SingleCall)

5.2 攻击步骤

  1. 构造恶意SOAP消息
  2. 发送HTTP请求到服务端
    • 方法:POST或M-POST
    • 头:SOAPAction:任意URI
    • 内容:恶意SOAP载荷
  3. 触发反序列化执行恶意代码

六、防御措施

  1. 避免使用TypeFilterLevel.Full

    • 保持默认的TypeFilterLevel.Low
    • 仅在绝对必要时使用Full级别
  2. 替换技术

    • 使用WCF替代.NET Remoting
    • WCF提供更安全的通信机制
  3. 输入验证

    • 对传入的SOAP消息进行严格验证
    • 限制可反序列化的类型
  4. 网络防护

    • 限制访问.rem端点的客户端
    • 监控异常的SOAP请求

七、扩展攻击面

  1. BinaryServerFormatterSinkProvider

    • 类似SoapServerFormatterSinkProvider
    • 用于TcpChannel/TcpServerChannel
    • 同样受TypeFilterLevel属性影响
  2. 其他实现ISerializable的可利用类

    • 除TextFormattingRunProperties外
    • 寻找其他可控的序列化类

八、总结

.NET Remoting反序列化漏洞的核心在于SoapServerFormatterSinkProvider的TypeFilterLevel配置不当,攻击者可以通过精心构造的SOAP消息实现远程代码执行。虽然.NET Remoting已逐渐被WCF取代,但在遗留系统中仍可能存在此漏洞,安全人员应重点关注相关配置和端点。

.NET Remoting反序列化漏洞分析与复现 一、漏洞概述 .NET Remoting应用程序在特定配置下存在反序列化安全风险,当服务端使用HTTP信道中的SoapServerFormatterSinkProvider类作为信道接收器,并且将TypeFilterLevel属性设置为Full时,攻击者可以利用反序列化漏洞实现远程代码执行(RCE)。 二、.NET Remoting基础概念 2.1 基本定义 .NET Remoting是一种分布式应用解决方案,允许不同AppDomain(应用程序域)之间进行通信,通信可以发生在: 同一进程中的不同AppDomain 同一系统中的不同进程 2.2 信道类型 .NET Remoting提供三种信道类型: IpcChannel : 使用Windows进程间通信(IPC)系统 仅限同一计算机上的应用程序域之间通信 比TCP或HTTP信道更快 TcpChannel : 基于Socket传输 默认使用二进制格式序列化 适用于局域网,传输性能高 HttpChannel : 使用HTTP协议传输 使用SOAP格式序列化 适用于广域网,可穿透防火墙 三、漏洞原理分析 3.1 关键组件 SoapServerFormatterSinkProvider : 实现IServerChannelSinkProvider接口 使用SoapFormatter格式化器序列化对象 包含关键属性TypeFilterLevel TypeFilterLevel属性 : Low(默认):仅支持基本远程处理功能相关类型 Full:支持所有类型,存在安全风险 3.2 攻击条件 服务端配置必须满足以下条件之一: 使用HttpServerChannel并传入SoapServerFormatterSinkProvider(TypeFilterLevel=Full) public HttpServerChannel(IDictionary properties, IServerChannelSinkProvider sinkProvider) public HttpServerChannel(string name, int port, IServerChannelSinkProvider sinkProvider) 使用HttpChannel并传入SoapServerFormatterSinkProvider(TypeFilterLevel=Full) public HttpChannel(IDictionary properties, IClientChannelSinkProvider clientSinkProvider, IServerChannelSinkProvider serverSinkProvider) 四、漏洞利用 4.1 利用链 利用 Microsoft.VisualStudio.Text.Formatting.TextFormattingRunProperties 类: 实现了ISerializable接口 包含ForegroundBrush属性支持XAML数据 存在于Microsoft.VisualStudio.Text.UI.Wpf.dll或Microsoft.PowerShell.Editor.dll中 4.2 攻击载荷构造 SOAP消息格式示例: 4.3 攻击请求特征 请求方法: 常规POST 或M-POST(强制POST) 请求头: 必须包含SOAPAction头 值可以是任意URI 请求URI: 通常以.rem为扩展名 IIS默认使用IsapiModule处理.rem请求 五、漏洞复现 5.1 环境搭建 创建服务端: 使用HttpChannel或HttpServerChannel 配置SoapServerFormatterSinkProvider(TypeFilterLevel.Full) 绑定端口(如1234) 创建远程对象: 继承MarshalByRefObject 使用WellKnown激活模式(SingleTon或SingleCall) 5.2 攻击步骤 构造恶意SOAP消息 发送HTTP请求到服务端 方法:POST或M-POST 头:SOAPAction:任意URI 内容:恶意SOAP载荷 触发反序列化执行恶意代码 六、防御措施 避免使用TypeFilterLevel.Full : 保持默认的TypeFilterLevel.Low 仅在绝对必要时使用Full级别 替换技术 : 使用WCF替代.NET Remoting WCF提供更安全的通信机制 输入验证 : 对传入的SOAP消息进行严格验证 限制可反序列化的类型 网络防护 : 限制访问.rem端点的客户端 监控异常的SOAP请求 七、扩展攻击面 BinaryServerFormatterSinkProvider : 类似SoapServerFormatterSinkProvider 用于TcpChannel/TcpServerChannel 同样受TypeFilterLevel属性影响 其他实现ISerializable的可利用类 : 除TextFormattingRunProperties外 寻找其他可控的序列化类 八、总结 .NET Remoting反序列化漏洞的核心在于SoapServerFormatterSinkProvider的TypeFilterLevel配置不当,攻击者可以通过精心构造的SOAP消息实现远程代码执行。虽然.NET Remoting已逐渐被WCF取代,但在遗留系统中仍可能存在此漏洞,安全人员应重点关注相关配置和端点。