CA2362:シリアル化可能な自動生成型の安全でない DataSet または DataTable は、リモート コード実行攻撃に対して脆弱になる可能性があります
プロパティ | 値 |
---|---|
ルール ID | CA2362 |
Title | シリアル化可能な自動生成型の安全でない DataSet または DataTable は、リモート コード実行攻撃に対して脆弱になる可能性があります |
[カテゴリ] | Security |
修正が中断か中断なしであるか | なし |
.NET 8 では既定で有効 | いいえ |
原因
SerializableAttribute でマークされたクラスまたは構造体に DataSet または DataTable フィールドまたはプロパティが含まれており、DesignerCategoryAttribute が含まれています。
CA2352 は、DesignerCategoryAttribute が存在しない場合の同様の規則です。
規則の説明
BinaryFormatter で信頼されていない入力を逆シリアル化し、逆シリアル化されたオブジェクト グラフに DataSet または DataTable が含まれている場合、攻撃者が悪意のあるペイロードを作成して、リモート コード実行攻撃を仕掛ける可能性があります。
この規則は CA2352 に似ていますが、GUI アプリケーション内のデータのメモリ内表現用に自動生成されたコードに使用されます。 通常、このような自動生成されたクラスは、信頼できない入力から逆シリアル化されることはありません。 アプリケーションの使用方法はさまざまです。
この規則では、逆シリアル化時に安全ではない型を検出します。 検出された型をコードで逆シリアル化しない場合、逆シリアル化の脆弱性はありません。
詳細については、「DataSet と DataTable のセキュリティ ガイダンス」を参照してください。
違反の修正方法
- 可能であれば、DataSet および DataTable ではなく、Entity Framework を使用します。
- シリアル化されたデータを改ざん防止にします。 シリアル化後に、シリアル化されたデータに暗号化署名します。 逆シリアル化する前に、暗号化署名を検証します。 暗号化キーの開示を防止し、キーのローテーションを設計します。
どのようなときに警告を抑制するか
次の場合は、このルールの警告を抑制できます。
- この規則によって検出された型が、直接的または間接的に、決して逆シリアル化されない。
- 入力が信頼されていることがわかっている。 アプリケーションの信頼境界とデータ フローは時間の経過と共に変わる可能性があることを考慮する。
- 違反を修正する方法のいずれかの予防措置を講じた。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA2362
// The code that's violating the rule is on this line.
#pragma warning restore CA2362
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA2362.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
疑似コードの例
違反
using System.Data;
using System.Xml.Serialization;
namespace ExampleNamespace
{
[global::System.CodeDom.Compiler.GeneratedCode(""System.Data.Design.TypedDataSetGenerator"", ""2.0.0.0"")]
[global::System.Serializable()]
[global::System.ComponentModel.DesignerCategoryAttribute(""code"")]
[global::System.ComponentModel.ToolboxItem(true)]
[global::System.Xml.Serialization.XmlSchemaProviderAttribute(""GetTypedDataSetSchema"")]
[global::System.Xml.Serialization.XmlRootAttribute(""Package"")]
[global::System.ComponentModel.Design.HelpKeywordAttribute(""vs.data.DataSet"")]
public class ExampleClass : global::System.Data.DataSet {
private DataTable table;
}
}
関連規則
CA2350:DataTable.ReadXml() の入力が信頼されていることを確認してください
CA2351:DataSet.ReadXml() の入力が信頼されていることを確認してください
CA2352: シリアル化可能な型の安全でない DataSet または DataTable は、リモート コード実行攻撃に対して脆弱になる可能性があります
CA2353: シリアル化可能な型の安全でない DataSet または DataTable
CA2354:逆シリアル化されたオブジェクト グラフの安全でない DataSet または DataTable は、リモート コード実行攻撃に対して脆弱になる可能性があります
CA2355:逆シリアル化されたオブジェクト グラフの安全でない DataSet または DataTable
CA2356: Web の逆シリアル化されたオブジェクト グラフの安全でない DataSet または DataTable
CA2362: シリアル化可能な自動生成型の安全でない DataSet または DataTable は、リモート コード実行攻撃に対して脆弱になる可能性があります
.NET