CA2300:請勿使用不安全的還原序列化程式 BinaryFormatter

屬性
規則識別碼 CA2300
標題 請勿使用不安全的還原序列化程式 BinaryFormatter
類別 安全性
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 No

原因

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter已呼叫或參考還原串行化方法。

檔案描述

還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 例如,對不安全還原串行化程式的攻擊可能會在基礎操作系統上執行命令、透過網路通訊或刪除檔案。

此規則會 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 尋找還原串行化方法呼叫或參考。 如果您只想在 屬性設定為限制類型時 Binder 還原串行化,請停用此規則並改為啟用規則 CA2301CA2302 。 限制可還原串行化哪些類型有助於緩解已知的遠端程式代碼執行攻擊,但還原串行化仍然容易受到阻斷服務攻擊的影響。

BinaryFormatter 不安全且無法確保安全。 如需詳細資訊,請參閱 BinaryFormatter 安全性指南

如何修正違規

  • 請改用安全的串行化程式,而且 不允許攻擊者指定要還原串行化的任意類型。 如需詳細資訊, 請參閱慣用的替代方案。
  • 讓串行化的數據防竄改。 串行化之後,以密碼編譯方式簽署串行化的數據。 還原串行化之前,請先驗證密碼編譯簽章。 保護密碼編譯金鑰,避免洩漏金鑰,並設計金鑰輪替。
  • 此選項可讓程式代碼容易受到阻斷服務攻擊,以及未來可能的遠端程式代碼執行攻擊。 如需詳細資訊,請參閱 BinaryFormatter 安全性指南。 限制還原串行化類型。 實作自訂 System.Runtime.Serialization.SerializationBinder。 還原串行化之前,請將 Binder 屬性設定為所有程式代碼路徑中自定義 SerializationBinder 的實例。 在覆寫 BindToType 的 方法中,如果類型非預期,則擲回例外狀況以停止還原串行化。

隱藏警告的時機

BinaryFormatter 不安全且無法確保安全。

虛擬程式代碼範例

違規

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class ExampleClass
{
    public object MyDeserialize(byte[] bytes)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        return formatter.Deserialize(new MemoryStream(bytes));
    }
}
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

Public Class ExampleClass
    Public Function MyDeserialize(bytes As Byte()) As Object
        Dim formatter As BinaryFormatter = New BinaryFormatter()
        Return formatter.Deserialize(New MemoryStream(bytes))
    End Function
End Class

CA2301:未先設定 BinaryFormatter.Binder 之前,請勿呼叫 BinaryFormatter.Deserialize

CA2302:呼叫 BinaryFormatter.Deserialize 之前,請務必先設定 BinaryFormatter.Binder