CA5360:請勿在還原序列化時呼叫危險的方法

屬性
規則識別碼 CA5360
標題 請勿在還原序列化時呼叫危險的方法
類別 安全性
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 No

原因

在還原串行化中呼叫下列其中一個危險的方法:

所有方法都符合下列其中一個需求,可能是還原串行化的回呼:

檔案描述

不安全的還原序列化是一個弱點,會在未受信任的資料用來濫用應用程式的邏輯、造成拒絕服務 (DoS) 攻擊,或甚至於還原序列化時執行任意程式碼時發生。 當應用程式還原序列化受到控制的不受信任資料時,惡意使用者可能會經常濫用這些還原序列化功能。 具體而言,在還原序列化過程中叫用危險方法。 成功的不安全還原序列化攻擊可讓攻擊者執行 DoS 攻擊、驗證略過和遠端程式碼執行等攻擊。

如何修正違規

從自動執行還原串行化回呼中移除這些危險的方法。 只有在驗證輸入之後,才呼叫危險的方法。

隱藏警告的時機

如果:

  • 您知道輸入是受信任的。 請考慮應用程式的信任界限和數據流可能會隨著時間而變更。
  • 串行化的數據是防竄改的。 串行化之後,以密碼編譯方式簽署串行化的數據。 還原串行化之前,請先驗證密碼編譯簽章。 保護密碼編譯金鑰,避免洩漏金鑰,並設計金鑰輪替。
  • 數據會驗證為應用程式的安全。

隱藏警告

如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。

#pragma warning disable CA5360
// The code that's violating the rule is on this line.
#pragma warning restore CA5360

若要停用檔案、資料夾或項目的規則,請在組態檔中將其嚴重性設定為 。none

[*.{cs,vb}]
dotnet_diagnostic.CA5360.severity = none

如需詳細資訊,請參閱 如何隱藏程式代碼分析警告

虛擬程式代碼範例

違規

using System;
using System.IO;
using System.Runtime.Serialization;

[Serializable()]
public class ExampleClass : IDeserializationCallback
{
    private string member;

    void IDeserializationCallback.OnDeserialization(Object sender)
    {
        var sourceFileName = "malicious file";
        var destFileName = "sensitive file";
        File.Copy(sourceFileName, destFileName);
    }
}

解決方案

using System;
using System.IO;
using System.Runtime.Serialization;

[Serializable()]
public class ExampleClass : IDeserializationCallback
{
    private string member;

    void IDeserializationCallback.OnDeserialization(Object sender)
    {
        var sourceFileName = "malicious file";
        var destFileName = "sensitive file";
        // Remove the potential dangerous operation.
        // File.Copy(sourceFileName, destFileName);
    }
}