CA3009: Review code for XML injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusungen von XML-Befehlen)
Eigenschaft | Wert |
---|---|
Regel-ID | CA3009 |
Titel | Review code for XML injection vulnerabilities (Überprüfen von Code auf Sicherheitsrisiken durch Einschleusungen von XML-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 unformatierte XML-Ausgaben.
Standardmäßig analysiert diese Regel die gesamte Codebasis, aber dieses Verhalten ist konfigurierbar.
Regelbeschreibung
Beachten Sie bei der Arbeit mit nicht vertrauenswürdigen Eingaben, dass Angriffe durch XML-Einschleusung berücksichtigt werden. Ein Angreifer kann XML-Einschleusung verwenden, um Sonderzeichen in ein XML-Dokument einzufügen, wodurch das Dokument ungültigen XML-Code enthält. Oder ein Angreifer könnte die XML-Knoten seiner Wahl in böswilliger Absicht einfügen.
Diese Regel versucht, Eingaben aus HTTP-Anforderungen zu ermitteln, die einen unformatierten XML-Schreibvorgang 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 unformatierten XML-Code 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
Verwenden Sie eine der folgenden Techniken, um einen jVerstoß zu beheben:
- Schreiben Sie keinen unformatierten XML-Code. Verwenden Sie stattdessen Methoden oder Eigenschaften, die ihre Eingabe XML-codieren.
- XML-codieren Sie Eingaben vor dem Schreiben von unformatiertem XML-Code.
- Überprüfen Sie Benutzereingaben, indem Sie Sanitizer für die Konvertierung in primitive Typen und XML-Codierung verwenden.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnungen von dieser Regel.
Pseudocodebeispiele
Verletzung
In diesem Beispiel wird die Eingabe auf die InnerXml-Eigenschaft des Stammelements festgelegt. Wenn eine Eingabe gültigen XML-Code enthält, können böswillige Benutzer*innen das Dokument vollständig ändern. Beachten Sie, dass alice
nach dem Hinzufügen der Benutzereingabe zum Dokument kein zulässiger Benutzer mehr ist.
protected void Page_Load(object sender, EventArgs e)
{
XmlDocument d = new XmlDocument();
XmlElement root = d.CreateElement("root");
d.AppendChild(root);
XmlElement allowedUser = d.CreateElement("allowedUser");
root.AppendChild(allowedUser);
allowedUser.InnerXml = "alice";
string input = Request.Form["in"];
root.InnerXml = input;
}
Sub Page_Load(sender As Object, e As EventArgs)
Dim d As XmlDocument = New XmlDocument()
Dim root As XmlElement = d.CreateElement("root")
d.AppendChild(root)
Dim allowedUser As XmlElement = d.CreateElement("allowedUser")
root.AppendChild(allowedUser)
allowedUser.InnerXml = "alice"
Dim input As String = Request.Form("in")
root.InnerXml = input
End Sub
Wenn Angreifer dies für die Eingabe some text<allowedUser>oscar</allowedUser>
verwenden, lautet das XML-Dokument wie folgt:
<root>some text<allowedUser>oscar</allowedUser>
</root>
Lösung
Um diesen Verstoß zu beheben, legen Sie die Eingabe auf die InnerText-Eigenschaft des Stammelements statt auf die InnerXml-Eigenschaft fest.
protected void Page_Load(object sender, EventArgs e)
{
XmlDocument d = new XmlDocument();
XmlElement root = d.CreateElement("root");
d.AppendChild(root);
XmlElement allowedUser = d.CreateElement("allowedUser");
root.AppendChild(allowedUser);
allowedUser.InnerText = "alice";
string input = Request.Form["in"];
root.InnerText = input;
}
Sub Page_Load(sender As Object, e As EventArgs)
Dim d As XmlDocument = New XmlDocument()
Dim root As XmlElement = d.CreateElement("root")
d.AppendChild(root)
Dim allowedUser As XmlElement = d.CreateElement("allowedUser")
root.AppendChild(allowedUser)
allowedUser.InnerText = "alice"
Dim input As String = Request.Form("in")
root.InnerText = input
End Sub
Wenn Angreifer dies für die Eingabe some text<allowedUser>oscar</allowedUser>
verwenden, lautet das XML-Dokument wie folgt:
<root>some text<allowedUser>oscar</allowedUser>
<allowedUser>alice</allowedUser>
</root>
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. |