Share via


CA3009: Granska koden för sårbarheter vid XML-inmatning

Property Värde
Regel-ID CA3009
Title Granska koden för sårbarheter för XML-inmatning
Kategori Säkerhet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

Potentiellt ej betrodda HTTP-begärandeindata når råa XML-utdata.

Som standard analyserar den här regeln hela kodbasen, men detta kan konfigureras.

Regelbeskrivning

När du arbetar med ej betrodda indata bör du tänka på XML-inmatningsattacker. En angripare kan använda XML-inmatning för att infoga specialtecken i ett XML-dokument, vilket gör dokumentet ogiltigt XML. Eller så kan en angripare infoga XML-noder som de väljer.

Den här regeln försöker hitta indata från HTTP-begäranden som når en rå XML-skrivning.

Kommentar

Den här regeln kan inte spåra data mellan sammansättningar. Om en sammansättning till exempel läser http-begärandeindata och sedan skickar den till en annan sammansättning som skriver rå XML, kommer den här regeln inte att generera någon varning.

Kommentar

Det finns en konfigurerbar gräns för hur djupt den här regeln ska analysera dataflödet mellan metodanrop. Se Analyserarkonfiguration för hur du konfigurerar gränsen i en EditorConfig-fil.

Så här åtgärdar du överträdelser

Om du vill åtgärda en överträdelse använder du någon av följande tekniker:

  • Skriv inte rå XML. Använd i stället metoder eller egenskaper som XML-kodar deras indata.
  • XML-koda indata innan du skriver rå XML.
  • Verifiera användarindata med hjälp av sanitizers för primitiv typkonvertering och XML-kodning.

När du ska ignorera varningar

Ignorera inte varningar från den här regeln.

Exempel på pseudokod

Kränkning

I det här exemplet anges indata till InnerXml egenskapen för rotelementet. Med angivna indata som innehåller giltig XML kan en obehörig användare sedan helt ändra dokumentet. Observera att det alice inte längre är en tillåten användare när användarens indata har lagts till i dokumentet.

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

Om en angripare använder detta för indata: some text<allowedUser>oscar</allowedUser>blir XML-dokumentet:

<root>some text<allowedUser>oscar</allowedUser>
</root>

Lösning

Åtgärda den här överträdelsen genom att ange indata till InnerText egenskapen för rotelementet i stället för egenskapen InnerXml .

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

Om en angripare använder detta för indata: some text<allowedUser>oscar</allowedUser>blir XML-dokumentet:

<root>some text&lt;allowedUser&gt;oscar&lt;/allowedUser&gt;
<allowedUser>alice</allowedUser>
</root>

Konfigurera kod för analys

Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.

Du kan konfigurera dessa alternativ för bara den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (säkerhet) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.

Exkludera specifika symboler

Du kan exkludera specifika symboler, till exempel typer och metoder, från analys. Om du till exempel vill ange att regeln inte ska köras på någon kod inom typer med namnet MyTypelägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |):

  • Endast symbolnamn (innehåller alla symboler med namnet, oavsett vilken typ eller namnrymd som innehåller).
  • Fullständigt kvalificerade namn i symbolens dokumentations-ID-format. Varje symbolnamn kräver ett symboltypprefix, till exempel M: för metoder, T: för typer och N: för namnområden.
  • .ctor för konstruktorer och .cctor statiska konstruktorer.

Exempel:

Alternativvärde Sammanfattning
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType Matchar alla symboler med namnet MyType.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 Matchar alla symboler med namnet antingen MyType1 eller MyType2.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Matchar en specifik metod MyMethod med den angivna fullständigt kvalificerade signaturen.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Matchar specifika metoder MyMethod1 och MyMethod2 med respektive fullständigt kvalificerade signaturer.

Exkludera specifika typer och deras härledda typer

Du kan exkludera specifika typer och deras härledda typer från analys. Om du till exempel vill ange att regeln inte ska köras på några metoder inom typer som heter MyType och deras härledda typer lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |):

  • Skriv endast namn (innehåller alla typer med namnet, oavsett vilken typ eller namnrymd som innehåller).
  • Fullständigt kvalificerade namn i symbolens dokumentations-ID-format, med ett valfritt T: prefix.

Exempel:

Alternativvärde Sammanfattning
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Matchar alla typer med namnet MyType och alla deras härledda typer.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 Matchar alla typer med namnet antingen MyType1 eller MyType2 och alla deras härledda typer.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Matchar en specifik typ MyType med ett angivet fullständigt kvalificerat namn och alla dess härledda typer.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Matchar specifika typer MyType1 och MyType2 med respektive fullständigt kvalificerade namn och alla deras härledda typer.