CA5360:請勿在還原序列化時呼叫危險的方法
屬性 | 值 |
---|---|
規則識別碼 | CA5360 |
標題 | 請勿在還原序列化時呼叫危險的方法 |
類別 | 安全性 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 8 中啟用 | No |
原因
在還原串行化中呼叫下列其中一個危險的方法:
- System.IO.Directory.Delete
- System.IO.DirectoryInfo.Delete
- System.IO.File.AppendAllLines
- System.IO.File.AppendAllText
- System.IO.File.AppendText
- System.IO.File.Copy
- System.IO.File.Delete
- System.IO.File.WriteAllBytes
- System.IO.File.WriteAllLines
- System.IO.File.WriteAllText
- System.IO.FileInfo.Delete
- System.IO.Log.LogStore.Delete
- System.Reflection.Assembly.GetLoadedModules
- System.Reflection.Assembly.Load
- System.Reflection.Assembly.LoadFrom
- System.Reflection.Assembly.LoadFile
- System.Reflection.Assembly.LoadModule
- System.Reflection.Assembly.LoadWithPartialName
- System.Reflection.Assembly.ReflectionOnlyLoad
- System.Reflection.Assembly.ReflectionOnlyLoadFrom
- System.Reflection.Assembly.UnsafeLoadFrom
所有方法都符合下列其中一個需求,可能是還原串行化的回呼:
- 標示為 System.Runtime.Serialization.OnDeserializingAttribute。
- 標示為 System.Runtime.Serialization.OnDeserializedAttribute。
- 實作 System.Runtime.Serialization.IDeserializationCallback.OnDeserialization。
- 實作 System.IDisposable.Dispose。
- 這是解構函式。
檔案描述
不安全的還原序列化是一個弱點,會在未受信任的資料用來濫用應用程式的邏輯、造成拒絕服務 (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);
}
}