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