CA2361:DataSet.ReadXml() を含む自動生成クラスが信頼されていないデータで使用されていないことを確認してください

プロパティ
ルール ID CA2361
Title DataSet.ReadXml() を含む自動生成クラスが信頼されていないデータで使用されていないことを確認してください
[カテゴリ] Security
修正が中断か中断なしであるか なし
.NET 8 では既定で有効 いいえ

原因

DataSet.ReadXml メソッドが呼び出されたか参照され、自動生成されたコード内にあります。

この規則では、自動生成コードを分類します。

CA2351 は、DataSet.ReadXml が自動生成されないコード内に現れる場合の同様の規則です。

規則の説明

信頼されていない入力を使用して DataSet を逆シリアル化すると、攻撃者が悪意のある入力を作成してサービス拒否攻撃を仕掛ける可能性があります。 リモート コード実行の不明な脆弱性が存在する可能性があります。

この規則は CA2351 に似ていますが、GUI アプリケーション内のデータのメモリ内表現用に自動生成されたコードに使用されます。 通常、このような自動生成されたクラスは、信頼できない入力から逆シリアル化されることはありません。 アプリケーションの使用方法はさまざまです。

詳細については、「DataSet と DataTable のセキュリティ ガイダンス」を参照してください。

違反の修正方法

  • 可能であれば、DataSet ではなく、Entity Framework を使用します。
  • シリアル化されたデータを改ざん防止にします。 シリアル化後に、シリアル化されたデータに暗号化署名します。 逆シリアル化する前に、暗号化署名を検証します。 暗号化キーの開示を防止し、キーのローテーションを設計します。

どのようなときに警告を抑制するか

次の場合は、このルールの警告を抑制できます。

  • 入力が信頼されていることがわかっている。 アプリケーションの信頼境界とデータ フローは時間の経過と共に変わる可能性があることを考慮する。
  • 違反を修正する方法のいずれかの予防措置を講じた。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

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

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

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

詳細については、「コード分析の警告を抑制する方法」を参照してください。

疑似コードの例

違反

namespace ExampleNamespace
{
    /// <summary>
    ///Represents a strongly typed in-memory cache of data.
    ///</summary>
    [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 partial class Something : global::System.Data.DataSet {

        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
        protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
            if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
                this.Reset();
                global::System.Data.DataSet ds = new global::System.Data.DataSet();
                ds.ReadXml(reader);
                if ((ds.Tables["Something"] != null)) {
                    base.Tables.Add(new SomethingTable(ds.Tables["Something"]));
                }
                this.DataSetName = ds.DataSetName;
                this.Prefix = ds.Prefix;
                this.Namespace = ds.Namespace;
                this.Locale = ds.Locale;
                this.CaseSensitive = ds.CaseSensitive;
                this.EnforceConstraints = ds.EnforceConstraints;
                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
                this.InitVars();
            }
            else {
                this.ReadXml(reader);
                this.InitVars();
            }
        }
    }
}

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