Teilen über


CA3003: Review code for file path injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusungen über einen Dateipfad)

Eigenschaft Wert
Regel-ID CA3003
Titel Review code for file path injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusungen über einen Dateipfad)
Kategorie Security
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Nein

Ursache

Potenziell nicht vertrauenswürdige HTTP-Anforderungseingaben erreichen den Pfad eines Dateivorgangs.

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

Regelbeschreibung

Wenn Sie mit nicht vertrauenswürdigen Eingaben aus Webanforderungen arbeiten, achten Sie darauf, benutzergesteuerte Eingaben beim Angeben von Pfaden zu Dateien zu verwenden. Ein Angreifer kann möglicherweise eine Datei unbeabsichtigt lesen, was zur Offenlegung vertraulicher Daten führt. Oder ein Angreifer kann unbeabsichtigt in eine Datei schreiben, was dazu führt, dass sensible Daten ohne entsprechende Autorisierung geändert werden oder die Sicherheit des Servers beeinträchtigt wird. Eine gängige Angreifertechnik ist Path Traversal für den Zugriff auf Dateien außerhalb des vorgesehenen Verzeichnisses.

Diese Regel versucht, Eingaben aus HTTP-Anforderungen zu ermitteln, die einen Pfad in einem Dateivorgang erreichen.

Hinweis

Diese Regel kann keine Daten über Assemblys hinweg nachverfolgen. Wenn eine Assembly z. B. die HTTP-Anforderungseingabe liest und sie dann an eine andere Assembly übergibt, die in eine Datei schreibt, generiert diese Regel keine Warnung.

Hinweis

Es gibt eine konfigurierbare Einschränkung, wie tief diese Regel den Datenfluss über Methodenaufrufe hinweg analysiert. Weitere Informationen zum Konfigurieren der Einschränkung in einer EditorConfig-Datei finden Sie unter Analysetoolkonfiguration.

Behandeln von Verstößen

  • Beschränken Sie nach Möglichkeit Dateipfade auf der Grundlage von Benutzereingaben auf eine explizit bekannte sichere Liste. Wenn Ihre Anwendung z. B. nur auf „red.txt“, „green.txt“ oder „blue.txt“ zugreifen muss, lassen Sie nur diese Werte zu.
  • Suchen Sie nach nicht vertrauenswürdigen Dateinamen, und überprüfen Sie, ob der Name wohlgeformt ist.
  • Verwenden Sie beim Angeben von Pfaden vollständige Pfadnamen.
  • Vermeiden Sie potenziell gefährliche Konstrukte wie PATH-Umgebungsvariablen.
  • Akzeptieren Sie nur lange Dateinamen, und überprüfen Sie den langen Namen, wenn der Benutzer kurze Namen übermittelt.
  • Schränken Sie Endbenutzereingabe auf gültige Zeichen ein.
  • Lehnen Sie Namen ab, bei denen die MAX_PATH-Länge überschritten wird.
  • Verarbeiten Sie Dateinamen wörtlich ohne Interpretation.
  • Bestimmen Sie, ob der Dateiname eine Datei oder ein Gerät darstellt.

Wann sollten Warnungen unterdrückt werden?

Wenn Sie die Eingabe entsprechend der Beschreibung im vorherigen Abschnitt überprüft haben, ist es in Ordnung, diese Warnung zu unterdrücken.

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 zutreffenden Regeln oder für alle zutreffenden Regeln in dieser Kategorie (Sicherheit) konfigurieren. Weitere Informationen finden Sie unter Konfigurationsoptionen für die Codequalitätsregel.

Ausschließen bestimmter Symbole

Sie können bestimmte Symbole, z. B. Typen und Methoden, von der Analyse ausschließen. 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

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 Format der Dokumentations-ID des Symbols 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) Trifft speziell auf die Methode MyMethod mit der angegebenen vollqualifizierten Signatur zu
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Trifft speziell auf die Methoden MyMethod1 und MyMethod2 mit den jeweiligen vollqualifizierten Signaturen zu

Ausschließen bestimmter Typen und von diesen abgeleiteten Typen

Sie können bestimmte Typen und von diesen abgeleitete Typen aus der Analyse ausschließen. 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

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 MyType-Typ mit einem angegebenen vollqualifizierten Namen und allen von diesem abgeleiteten Typen überein.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Stimmt mit bestimmten MyType1- und MyType2-Typen mit den entsprechenden vollqualifizierten Namen und allen von diesen abgeleiteten Typen überein.

Pseudocodebeispiele

Verletzung

using System;
using System.IO;

public partial class WebForm : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string userInput = Request.Params["UserInput"];
        // Assume the following directory structure:
        //   wwwroot\currentWebDirectory\user1.txt
        //   wwwroot\currentWebDirectory\user2.txt
        //   wwwroot\secret\allsecrets.txt
        // There is nothing wrong if the user inputs:
        //   user1.txt
        // However, if the user input is:
        //   ..\secret\allsecrets.txt
        // Then an attacker can now see all the secrets.

        // Avoid this:
        using (File.Open(userInput, FileMode.Open))
        {
            // Read a file with the name supplied by user
            // Input through request's query string and display
            // The content to the webpage.
        }
    }
}
Imports System
Imports System.IO

Partial Public Class WebForm
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs)
        Dim userInput As String = Me.Request.Params("UserInput")
        ' Assume the following directory structure:
        '   wwwroot\currentWebDirectory\user1.txt
        '   wwwroot\currentWebDirectory\user2.txt
        '   wwwroot\secret\allsecrets.txt
        ' There is nothing wrong if the user inputs:
        '   user1.txt
        ' However, if the user input is:
        '   ..\secret\allsecrets.txt
        ' Then an attacker can now see all the secrets.

        ' Avoid this:
        Using File.Open(userInput, FileMode.Open)
            ' Read a file with the name supplied by user
            ' Input through request's query string and display
            ' The content to the webpage.
        End Using
    End Sub
End Class