C# 使用 BinaryFormatter 和相关类型时的反序列化风险

C# 使用 BinaryFormatter 和相关类型时的反序列化风险

    由来:在项目使用.NET Reactor 混淆 C# 的序列化和反序列化发现存在的问题,读取文件时,转化为对应的类数据有时候为空,所以就在网上搜索了相关知识,在此做个笔记以备忘记了。

本文内容

    反序列化漏洞:BinaryFormatter 安全漏洞

本文适用于以下类型

  • BinaryFormatter
  • SoapFormatter
  • NetDataContractSerializer
  • LosFormatter
  • ObjectStateFormatter

本文适用于以下 .NET 实现

  • 所有版本的 .NET Framework
  • .NET Core 2.1 - 3.1
  • .NET 5 及更高版本

 注意

    BinaryFormatter 类型会带来风险,不建议将其用于数据处理。 即使应用程序认为自己正在处理的数据是可信的,也应尽快停止使用 BinaryFormatter。 BinaryFormatter 不安全,无法确保安全。

 备注

    从 .NET 9 开始,随机 BinaryFormatter 实现会在使用时引发异常,即使设置之前支持其使用也是如此。 这些设置也会被删除。 有关更多信息,请参阅官方 BinaryFormatter 迁移指南。

反序列化漏洞

    反序列化漏洞是指不安全地处理请求有效负载的威胁类别。 成功利用这些漏洞攻击应用的攻击者可导致目标应用内出现拒绝服务 (DoS)、信息泄露或远程代码执行。 此风险类别始终是 10 项最严重的 OWASP 风险之一。 攻击目标包括使用多种语言(包括 C/C++、Java 和 C#)编写的应用。

    在 .NET 中,风险最大的目标是使用 BinaryFormatter 类型来反序列化数据的应用。 BinaryFormatter 因为其强大的功能和易用性而广泛用于整个 .NET 生态系统。 但是,其强大的功能也让攻击者能够影响目标应用内的控制流。 成功的攻击可能导致攻击者能够在目标进程的上下文中运行代码。

     更简单的比喻是,假设在有效负载上调用 BinaryFormatter.Deserialize 相当于将该有效负载解释为独立的可执行文件并启动它。

BinaryFormatter 安全漏洞

     警告:将 BinaryFormatter.Deserialize 方法用于不受信任的输入时,该方法永远都不安全。 强烈建议使用者改为考虑使用本文后面概述的替代方法之一。

    BinaryFormatter 是在反序列化漏洞成为一个众所周知的威胁类别之前实现的。 因此,代码不遵循现代最佳做法。 Deserialize 方法可用作攻击者对使用中的应用执行 DoS 攻击的载体。 这些攻击可能导致应用无响应或进程意外终止。 使用 SerializationBinder 或任何其他 BinaryFormatter 配置开关都无法缓解此类攻击。 .NET 认为此行为是设计使然,因此不会发布代码更新来修改此行为。

    BinaryFormatter.Deserialize 可能容易受到其他攻击类别的影响,例如信息泄露或远程代码执行。 利用自定义 SerializationBinder 等功能可能不足以正确缓解这些风险。 攻击者可能会发现绕过现有缓解措施的新攻击。 .NET 不会提交发布修补程序,以响应任何此类绕过。 此外,开发或部署此类修补程序在技术上可能不可行。 你应该评估你的方案,并考虑你可能面临这些风险。

    我们建议 BinaryFormatter 使用者对其应用执行单独的风险评估。 由使用者完全负责确定是否利用 BinaryFormatter。 如果你正在考虑使用它,则应对安全性、技术、信誉、法律和法规后果进行风险评估。

首选替代方法

    .NET 提供了多个随附的序列化程序,可用于安全处理不受信任的数据:

XmlSerializer 和 DataContractSerializer用于将对象图序列化为 XML 或从 XML 序列化对象图。 不要将 DataContractSerializer 与 NetDataContractSerializer 混淆。
BinaryReader 和 BinaryWriter适用于 XML 和 JSON。
System.Text.Json API用于将对象图序列化为 JSON。

危险的替代方法

    避免使用以下序列化程序:

SoapFormatter
LosFormatter
NetDataContractSerializer
ObjectStateFormatter


    上述序列化程序都执行不受限制的多态反序列化,并且会带来风险,就像 BinaryFormatter 一样。

假设数据值得信任的风险

    通常,应用开发人员可能会认为他们只是在处理受信任的输入。 在一些罕见的情况下,可实现真正的安全输入。 但更常见的情况是,有效负载跨越了信任边界,而开发人员却没有意识到这一点。

    考虑本地服务器,员工在其中使用其工作站的桌面客户端与服务进行交互。 这个场景可能被天真地视为可以接受使用 BinaryFormatter 的“安全”设置。 但是,这个场景为恶意软件提供了一个载体,使恶意软件能够访问单个员工的计算机,从而能够在整个企业中传播。 该恶意软件可以利用企业使用 BinaryFormatter 造成的漏洞,从员工的工作站横向移动到后端服务器。 然后,它可以泄露公司的敏感数据。 此类数据可能包括商业机密或客户数据。

    还考虑使用借助 BinaryFormatter 来保持保存状态的应用。 最初看来这似乎是一个安全的方案,因为在你自己的硬盘驱动器上读写数据威胁较低。 但是,通过电子邮件或 Internet 共享文档是很常见的,并且大多数最终用户不会认为打开这些下载的文件属于危险行为。

    攻击者可以利用此场景来制造恶意结果。 如果应用是一款游戏,则共享保存文件的用户会在不知情的情况下面临风险。 开发者自身也可能成为目标。 攻击者可能会通过电子邮件向开发者的技术支持人员发送电子邮件,并添加恶意数据文件作为附件,然后要求支持人员打开该文件。 这种攻击可以为攻击者提供一个在企业中的据点。

    另一种场景是数据文件存储在云存储空间中,并在用户的计算机之间自动同步。 能够访问云存储帐户的攻击者可以对数据文件进行病毒攻击。 此数据文件将自动同步到用户的计算机。 用户下一次打开数据文件时,攻击者的有效负载就会运行。 因此,攻击者可以利用云存储帐户泄露来获得完整的代码执行权限。

    考虑从桌面安装模型迁移到云优先模型的应用。 此场景包括从桌面应用或丰富客户端模型迁移到基于 Web 的模型的应用。 任何为桌面应用绘制的威胁模型都不一定适用于基于云的服务。 桌面应用的威胁模型可能会将给定的威胁视为“客户端攻击自身不感兴趣”。但是,当考虑到远程用户(客户端)攻击云服务本身时,同样的威胁可能会变得有趣。

   文章参考来源:使用 BinaryFormatter 和相关类型时的反序列化风险 - .NET | Microsoft Learn


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCv高阶(四)——角点检测

一、角点检测 在计算机视觉中,角点检测是识别图像中局部区域(角点)的关键技术,这些区域通常是两条或多条边缘的交点,具有丰富的结构信息,常用于图像匹配、跟踪、三维重建等任务。 Harris角点检测算法是一…

Conda 入门指令教程

Conda 入门指令教程 Conda 是一个强大的包和环境管理工具,广泛应用于数据科学和机器学习项目中。本文将介绍 Conda 的常用指令,帮助你快速上手。 1. Conda 基础操作 查看 Conda 版本 conda --version显示当前安装的 Conda 版本。 更新 Conda conda…

Unity ShaderLab引用HLSL文件找不到其中函数

在写Unity Shader的过程中,常常需要将方法封装到HLSL文件中,今天遇到一个这样的报错, 明明hlsl文件路径引用没问题,却引用不到方法 并且将分散文件中的函数复制过来一切正常,最终定位到HLSL的预编译指令中 这指令的…

uniapp上传图片时(可选微信头像、相册、拍照)

参考文献&#xff1a;微信小程序登录——头像_onchooseavatar-CSDN博客 <button open-type"chooseAvatar" chooseavatar"onChooseAvatar"> </button>onChooseAvatar(e) {uni.showLoading({title: 上传中...,mask: true});uni.uploadFile({url…

单元测试的一般步骤

Qt Test Qt Test 是 Qt 开发人员发布的一个单元测试框架&#xff0c;用于测试基于 Qt 框架的应用程序或库。它提供了单元测试框架中常见的所有功能以及用于测试图形用户界面的扩展。 1.自动化测试包络ui测试>接口测试>单元测试&#xff1b;现问如何使用Qt进行单元测试&…

【Matlab】中国沿岸潮滩宽度和坡度分布

【Matlab】中国沿岸潮滩宽度和坡度分布 参考文献见最后或者阅读原文&#xff01; 中国沿岸潮滩宽度和坡度分布: figure 1 a 潮滩宽度分布。b 潮滩坡度分布。 图中标注了中国沿海各省&#xff0c;分别为辽宁&#xff08;LN&#xff09;、河北&#xff08;HB&#xff09;、山东&…

理解.NET Core中的配置Configuration

什么是配置 .NET中的配置&#xff0c;本质上就是key-value键值对&#xff0c;并且key和value都是字符串类型。 在.NET中提供了多种配置提供程序来对不同的配置进行读取、写入、重载等操作&#xff0c;这里我们以为.NET 的源码项目为例&#xff0c;来看下.NET中的配置主要是有…

windows服务器及网络:论如何安装(虚拟机)

今天我要介绍的是&#xff1a;在Windows中对于安装系统&#xff08;虚拟机的步骤以及相关的安装事宜&#xff09;&#xff0c;事不宜迟&#xff0c;让我们来看看系统安装&#xff08;虚拟机&#xff09;是怎么操作的&#xff1a; 对现在来说&#xff0c;安装电脑系统已经是非常…

shardingsphere-jdbc集成Seata分布式事务

1、导入相关依赖 <!-- shardingsphere-jdbc --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId><version>5.5.1</version></dependency><!-- shardingspher…

05-DevOps-Jenkins自动拉取构建代码

新建Gitlab仓库 先在Gitab上创建一个代码仓库&#xff0c;选择创建空白项目 安装说明进行填写&#xff0c;然后点击创建项目 创建好的仓库是空的&#xff0c;什么都没有 新建一个springboot项目&#xff0c;用于代码上传使用。 只是为了测试代码上传功能&#xff0c;所以代码…

C#核心(24)结构体和类的区别,抽象类和接口的区别(面试常问)

前言 随着上一节我们对StringBulider的讲解落下帷幕&#xff0c;c#核心的知识点我们也即将告一段落,我们讲完了面向对象要用的三大特性&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;和七大原则。期中自然也不乏一些小的散的碎的的知识点。 今天我们要讲的也…

HTMLCSS实现异环网站,期末web作业

本网站是我在学习前端时敲得&#xff0c;仅供学习使用。 这段代码是一个完整的 HTML 网页项目&#xff0c;包含 HTML、CSS 和 JavaScript 部分&#xff0c;用于构建一个名为 “异环” 的网页。网页具备头部导航栏、主体视频展示、图片交互元素、音乐播放控制、视频弹窗播放以及…

Oracle表的别名不能用as,列的别名可以用as

在 Oracle 数据库中&#xff0c;‌表的别名‌和‌列的别名‌在使用 AS 关键字时确实有不同规则&#xff0c;以下是详细说明&#xff1a; 1. 表的别名&#xff08;Table Alias&#xff09;‌ ‌不支持 AS 关键字‌&#xff0c;直接跟在表名后即可。‌语法示例‌&#xff1a; S…

【SAP ME 44】在 HANA DB中报废SFC时的SHOP_ORDER表记录锁定

症状 SELECT…FROM SHOP_ORDER FOR UPDATE 在 SFC 报废期间持有锁,当同时调用数量较大时,可能会导致 HANA 数据库出现大量锁积压。这有时会导致因等待 HANA 数据库释放“选择更新”锁而导致报废 SFC 花费数分钟。 HANA 数据库日志中的示例: # begin PreparedStatement_ex…

Vscode开发Vue项目NodeJs启动报错处理

文章目录 背景一、npm启动报错报错信息定位原因处理方案第一步、下载安装高版本 二、node 无法识别报错信息处理方案定位原因第一步、检测环境变量第二步、重新开启界面 背景 使用Vscode开发Vue项目&#xff0c;使用到NodeJs&#xff0c;记录出现的问题及处理方案&#xff0c;…

破局遗留系统!AI自动化重构:从静态方法到Spring Bean注入实战

在当今快速发展的软件行业中,许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法,随着业务的不断发展,其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具,为 Java 遗留系统的重构提供了全新的解决方案,能够实现从静态方法到 Spring B…

2025妈妈杯数学建模C题完整分析论文(共36页)(含模型建立、可运行代码、数据)

2025 年第十五届 MathorCup 数学建模C题完整分析论文 目录 摘 要 一、问题分析 二、问题重述 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1代码&#xff08;仅供参考&#xff09; 4.1.4问题1求解结果&#xff08;仅…

【Python爬虫详解】第一篇:Python爬虫入门指南

什么是网络爬虫&#xff1f; 网络爬虫&#xff08;Web Crawler&#xff09;是一种自动获取网页内容的程序。它可以访问网站&#xff0c;抓取页面内容&#xff0c;并从中提取有价值的数据。在信息爆炸的时代&#xff0c;爬虫技术可以帮助我们高效地收集、整理和分析互联网上的海…

【JavaWeb后端开发02】SpringBootWeb + Https协议

课程内容&#xff1a; SpringBootWeb 入门 Http协议 SpringBootWeb案例 分层解耦 文章目录 1. SpringBootWeb入门1.1 概述1.2 入门程序1.2.1 需求1.2.2 开发步骤1.2.3 常见问题 1.3 入门解析 2. HTTP协议2.1 HTTP概述2.1.1 介绍2.1.2 特点 2.2 HTTP请求协议2.2.1 介绍2.2.2…

MATLAB 控制系统设计与仿真 - 37

范数鲁棒控制器的设计 鲁棒控制器的设计 根据双端子状态方程对象模型结构&#xff0c;控制器设计的目标是找到一个控制器K(s),它能保证闭环系统的范数限制在一个给定的小整数下&#xff0c;即 这时控制器的状态方程为&#xff1a; 其中X与Y分别为下面两个代数Riccati方程的解…