CA5360: 逆シリアル化で危険なメソッドを呼び出さないでください
プロパティ | 値 |
---|---|
ルール ID | CA5360 |
Title | 逆シリアル化で危険なメソッドを呼び出さないでください |
[カテゴリ] | Security |
修正が中断か中断なしであるか | なし |
.NET 8 では既定で有効 | いいえ |
原因
逆シリアル化で、次の危険なメソッドのいずれかを呼び出しています。
- 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);
}
}
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET