Share via


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 は、リモート コード実行攻撃に対して脆弱になる可能性があります