Freigeben über


CA5381: Stellen Sie sicher, dass keine Zertifikate zum Stammspeicher hinzugefügt werden.

Eigenschaft Wert
Regel-ID CA5381
Titel Stellen Sie sicher, dass keine Zertifikate zum Stammspeicher hinzugefügt werden.
Kategorie Security
Fix führt zu Unterbrechungen oder bleibt funktionsfähig Untrennbar
Standardmäßig in .NET 10 aktiviert Nein
Anwendbare Sprachen C# und Visual Basic

Ursache

Durch das Hinzufügen von Zertifikaten zu den vertrauenswürdigen Stammzertifikaten des Betriebssystems erhöht sich das Risiko, eine nicht vertrauenswürdige Zertifizierungsstelle freizugeben.

Standardmäßig analysiert diese Regel die gesamte Codebasis, aber dieses Verhalten ist konfigurierbar.

Regelbeschreibung

Diese Regel erkennt Code, mit dem möglicherweise ein Zertifikat zum Zertifikatspeicher für vertrauenswürdige Stammzertifizierungsstellen hinzugefügt wird. Standardmäßig ist der Zertifikatspeicher für vertrauenswürdige Root-Zertifizierungsstellen mit einer Reihe von öffentlichen Zertifizierungsstellen konfiguriert, die die Anforderungen des Microsoft Root Certificate Program erfüllen. Da alle vertrauenswürdigen Stammzertifizierungsstellen Zertifikate für jede beliebige Domäne ausstellen können, können Angreifer eine schwache oder erzwingende Zertifizierungsstelle, die Sie selbst installieren, für Angriffe auswählen. Bereits eine einzelne anfällige, schädliche oder erzwingende Zertifizierungsstelle beeinträchtigt die Sicherheit des gesamten Systems.

So beheben Sie Verstöße

Installieren Sie keine Zertifikate im Zertifikatspeicher für vertrauenswürdige Stammzertifizierungsstellen.

Wann sollten Warnungen unterdrückt werden?

Ein Unterdrücken dieser Regel ist nicht zu empfehlen.

Konfigurieren des zu analysierenden Codes

Mithilfe der folgenden Optionen können Sie konfigurieren, für welche Teile Ihrer Codebasis diese Regel ausgeführt werden soll.

Sie können diese Optionen nur für diese Regel, für alle Regeln, für die sie gelten, oder für alle Regeln in dieser Kategorie (Sicherheit), für die sie gelten, konfigurieren. Weitere Informationen finden Sie unter Konfigurationsoptionen für die Codequalitätsregel.

Ausschließen bestimmter Symbole

Sie können bestimmte Symbole, wie z. B. Typen und Methoden, von der Analyse ausschließen, indem Sie die Option excluded_symbol_names festlegen. Sie können beispielsweise festlegen, dass die Regel nicht für Code innerhalb von Typen namens MyType ausgeführt werden soll, indem Sie einer EDITORCONFIG-Datei in Ihrem Projekt das folgende Schlüssel-Wert-Paar hinzufügen:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Hinweis

Ersetzen Sie das XXXX-Element von CAXXXX durch die ID der entsprechenden Regel.

Zulässige Formate für Symbolnamen im Optionswert (durch | getrennt):

  • Nur Symbolname (schließt alle Symbole mit dem Namen ein, unabhängig vom enthaltenden Typ oder Namespace)
  • Vollqualifizierte Namen im Dokumentations-ID-Format der Symbole. Jeder Symbolname erfordert ein Symbolartpräfix, z. B. M: für Methoden, T: für Typen und N: für Namespaces.
  • .ctor für Konstruktoren und .cctor für statische Konstruktoren

Beispiele:

Optionswert Zusammenfassung
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType Trifft auf alle Symbole namens MyType zu
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 Trifft auf alle Symbole namens MyType1 oder MyType2 zu
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Entspricht der speziellen Methode MyMethod mit der angegebenen vollqualifizierten Signatur.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Ordnet die spezifischen Methoden MyMethod1 und MyMethod2 ihren jeweiligen vollqualifizierten Signaturen zu.

Ausschließen bestimmter Typen und von diesen abgeleiteten Typen

Sie können bestimmte Typen und ihre abgeleiteten Typen von der Analyse ausschließen, indem Sie die Option excluded_type_names_with_derived_types festlegen. Wenn Sie z. B. festlegen möchten, dass die Regel nicht für Methoden innerhalb von MyType-Typen und von diesen abgeleiteten Typen ausgeführt werden soll, fügen Sie einer EDITORCONFIG-Datei in Ihrem Projekt das folgende Schlüssel-Wert-Paar hinzu:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Hinweis

Ersetzen Sie das XXXX-Element von CAXXXX durch die ID der entsprechenden Regel.

Zulässige Formate für Symbolnamen im Optionswert (durch | getrennt):

  • Nur Typname (schließt alle Typen mit dem Namen ein, unabhängig vom enthaltenden Typ oder Namespace)
  • Vollqualifizierte Namen im Dokumentations-ID-Format des Symbols mit einem optionalen Präfix T:

Beispiele:

Optionswert Zusammenfassung
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Stimmt mit allen MyType-Typen und allen von diesen abgeleiteten Typen überein.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 Stimmt mit allen MyType1- oder MyType2-Typen und allen von diesen abgeleiteten Typen überein.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Stimmt mit einem bestimmten Typ MyType überein, der anhand eines angegebenen vollqualifizierten Namens und aller von ihm abgeleiteten Typen identifiziert wird.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Bestimmte MyType1- und MyType2-Typen werden mit ihren entsprechenden vollqualifizierten Namen und allen abgeleiteten Typen abgeglichen.

Pseudocodebeispiele

Verletzung

Das folgende Pseudocodebeispiel veranschaulicht das von dieser Regel erkannte Muster.

using System;
using System.Security.Cryptography.X509Certificates;

class TestClass
{
    public void TestMethod()
    {
        var storeName = StoreName.Root;
        Random r = new Random();

        if (r.Next(6) == 4)
        {
            storeName = StoreName.My;
        }

        var x509Store = new X509Store(storeName);
        x509Store.Add(new X509Certificate2());
    }
}

Lösung

using System.Security.Cryptography.X509Certificates;

class TestClass
{
    public void TestMethod()
    {
        var storeName = StoreName.My;
        var x509Store = new X509Store(storeName);
        x509Store.Add(new X509Certificate2());
    }
}