Udostępnij za pośrednictwem


CA2361: Upewnij się, że automatycznie wygenerowana klasa zawierająca klasę DataSet.ReadXml() nie jest używana z niezaufanymi danymi

Właściwości Wartość
Identyfikator reguły CA2361
Stanowisko Upewnij się, że automatycznie wygenerowana klasa zawierająca element DataSet.ReadXml() nie jest używana z niezaufanymi danymi
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

Metoda DataSet.ReadXml została wywołana lub odwołana i znajduje się w kodzie wygenerowanym automatycznie.

Ta reguła klasyfikuje automatycznie wygenerowany kod b:

CA2351 jest podobną regułą, jeśli DataSet.ReadXml występuje w kodzie niegenerowanym automatycznie.

Opis reguły

W przypadku deserializacji elementu DataSet z niezaufanymi danymi wejściowymi osoba atakująca może utworzyć złośliwe dane wejściowe w celu przeprowadzenia ataku typu "odmowa usługi". Może istnieć nieznana luka w zabezpieczeniach dotycząca zdalnego wykonywania kodu.

Ta reguła jest podobna do CA2351, ale w przypadku automatycznie wygenerowanego kodu dla reprezentacji danych w pamięci w aplikacji graficznego interfejsu użytkownika. Zazwyczaj te automatycznie wygenerowane klasy nie są deserializowane z niezaufanych danych wejściowych. Użycie aplikacji może się różnić.

Aby uzyskać więcej informacji, zobacz DataSet and DataTable security guidance (Wskazówki dotyczące zabezpieczeń zestawu danych i tabeli danych).

Jak naprawić naruszenia

  • Jeśli to możliwe, użyj programu Entity Framework, a nie .DataSet
  • Ustaw serializacji danych na dowód manipulacji. Po serializacji kryptograficznie podpisz serializowane dane. Przed deserializacji zweryfikuj podpis kryptograficzny. Ochrona klucza kryptograficznego przed ujawnieniem i projektowaniem rotacji kluczy.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli:

  • Wiesz, że dane wejściowe są zaufane. Należy wziąć pod uwagę, że granica zaufania aplikacji i przepływy danych mogą ulec zmianie w czasie.
  • Podjęto jeden z środków ostrożności w temacie Jak naprawić naruszenia.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykłady przykładów kodu przykładowego

Naruszenie

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: Upewnij się, że dane wejściowe elementu DataTable.ReadXml() są zaufane

CA2351: Upewnij się, że dane wejściowe elementu DataSet.ReadXml() są zaufane

CA2352: Niebezpieczny element DataSet lub DataTable w typie z możliwością serializacji może być narażony na ataki zdalnego wykonywania kodu

CA2353: Niebezpieczny zestaw danych lub dataTable w typie z możliwością serializacji

CA2354: Niebezpieczny element DataSet lub DataTable w deserializowanym grafie obiektu może być narażony na atak zdalnego wykonywania kodu

CA2355: Niebezpieczny element DataSet lub DataTable w deserializowanym grafie obiektu

CA2356: Niebezpieczny element DataSet lub DataTable w internetowym deserializowanym grafie obiektów

CA2362: Niebezpieczny element DataSet lub DataTable w automatycznie wygenerowanym typie serializowalnym może być narażony na ataki zdalnego wykonywania kodu