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.pswp.cn/web/76591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76591.shtml
英文地址,請注明出處:http://en.pswp.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方程的解…