CA3005: Review code for LDAP injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusung von LDAP-Befehlen)
Eigenschaft | Wert |
---|---|
Regel-ID | CA3005 |
Titel | Review code for LDAP injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusung von LDAP-Befehlen) |
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 eine LDAP-Anweisung.
Standardmäßig analysiert diese Regel die gesamte Codebasis, aber dieses Verhalten ist konfigurierbar.
Regelbeschreibung
Beachten Sie beim Arbeiten mit nicht vertrauenswürdigen Eingaben Angriffe über LDAP-Einschleusung (Lightweight Directory Access Protocol). Ein Angreifer kann potenziell böswillige LDAP-Anweisungen für Informationsverzeichnisse ausführen. Anwendungen, die Benutzereingaben verwenden, um dynamische LDAP-Anweisungen für den Zugriff auf Verzeichnisdienste zu erstellen, sind besonders anfällig.
Diese Regel versucht, Eingaben aus HTTP-Anforderungen zu ermitteln, die eine LDAP-Anweisung 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 eine LDAP-Anweisung ausführt, 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
Erwägen Sie für den benutzergesteuerten Teil der LDAP-Anweisungen eine der folgenden Aktionen:
- Lassen Sie nur eine Zulassungsliste mit Zeichen zu, die keine Sonderzeichen sind.
- Lassen Sie keine Sonderzeichen zu.
- Verwenden Sie Escapezeichen für Sonderzeichen.
Weitere Anleitungen finden Sie unter OWASP: Cheat Sheet zur Verhinderung von LDAP-Einschleusung.
Wann sollten Warnungen unterdrückt werden?
Wenn Sie wissen, dass die Eingabe zur Sicherheit validiert oder mit Escapezeichen versehen wurde, können Sie diese Warnung unterdrücken.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA3005
// The code that's violating the rule is on this line.
#pragma warning restore CA3005
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA3005.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.
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 undN:
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.DirectoryServices;
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string userName = Request.Params["user"];
string filter = "(uid=" + userName + ")"; // searching for the user entry
// In this example, if we send the * character in the user parameter which will
// result in the filter variable in the code to be initialized with (uid=*).
// The resulting LDAP statement will make the server return any object that
// contains a uid attribute.
DirectorySearcher searcher = new DirectorySearcher(filter);
SearchResultCollection results = searcher.FindAll();
// Iterate through each SearchResult in the SearchResultCollection.
foreach (SearchResult searchResult in results)
{
// ...
}
}
}
Imports System
Imports System.DirectoryServices
Partial Public Class WebForm
Inherits System.Web.UI.Page
Protected Sub Page_Load(send As Object, e As EventArgs)
Dim userName As String = Me.Request.Params(""user"")
Dim filter As String = ""(uid="" + userName + "")"" ' searching for the user entry
' In this example, if we send the * character in the user parameter which will
' result in the filter variable in the code to be initialized with (uid=*).
' The resulting LDAP statement will make the server return any object that
' contains a uid attribute.
Dim searcher As DirectorySearcher = new DirectorySearcher(filter)
Dim results As SearchResultCollection = searcher.FindAll()
' Iterate through each SearchResult in the SearchResultCollection.
For Each searchResult As SearchResult in results
' ...
Next searchResult
End Sub
End Class