CA3009: Przegląd kodu pod kątem luk w zabezpieczeniach polegających na wstrzyknięciu kodu XML
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA3009 |
Tytuł | Przegląd kodu pod kątem luk umożliwiających wstrzyknięcie kodu XML |
Kategoria | Bezpieczeństwo |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Potencjalnie niezaufane dane wejściowe żądania HTTP docierają do nieprzetworzonych danych wyjściowych XML.
Domyślnie ta reguła analizuje całą bazę kodu, ale można to skonfigurować.
Opis reguły
Podczas pracy z niezaufanymi danymi wejściowymi należy pamiętać o atakach polegających na wstrzyknięciu kodu XML. Osoba atakująca może użyć iniekcji XML, aby wstawić znaki specjalne do dokumentu XML, co powoduje, że dokument jest nieprawidłowy. Lub osoba atakująca może złośliwie wstawić wybrane węzły XML.
Ta reguła próbuje znaleźć dane wejściowe z żądań HTTP osiągających nieprzetworzony zapis XML.
Uwaga
Ta reguła nie może śledzić danych między zestawami. Jeśli na przykład jeden zestaw odczytuje dane wejściowe żądania HTTP, a następnie przekazuje go do innego zestawu, który zapisuje nieprzetworzony kod XML, ta reguła nie generuje ostrzeżenia.
Uwaga
Istnieje konfigurowalny limit sposobu, w jaki ta reguła będzie analizować przepływ danych między wywołaniami metod. Zobacz Konfiguracja analizatora, aby dowiedzieć się, jak skonfigurować limit w pliku EditorConfig.
Jak naprawić naruszenia
Aby naprawić naruszenie, użyj jednej z następujących technik:
- Nie zapisuj nieprzetworzonego kodu XML. Zamiast tego należy użyć metod lub właściwości kodujących dane wejściowe xml.
- Dane wejściowe kodu XML przed zapisem nieprzetworzonego kodu XML.
- Zweryfikuj dane wejściowe użytkownika przy użyciu narzędzi sanitizer do konwersji typów pierwotnych i kodowania XML.
Kiedy pomijać ostrzeżenia
Nie pomijaj ostrzeżeń z tej reguły.
Przykłady przykładów kodu przykładowego
Naruszenie
W tym przykładzie dane wejściowe są ustawione na InnerXml właściwość elementu głównego. Biorąc pod uwagę dane wejściowe zawierające prawidłowy kod XML, złośliwy użytkownik może następnie całkowicie zmienić dokument. Zwróć uwagę, że alice
nie jest już dozwolonym użytkownikiem po dodaniu danych wejściowych użytkownika do dokumentu.
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
Jeśli osoba atakująca użyje tego elementu do wprowadzania danych wejściowych: some text<allowedUser>oscar</allowedUser>
, dokument XML będzie następujący:
<root>some text<allowedUser>oscar</allowedUser>
</root>
Rozwiązanie
Aby naprawić to naruszenie, ustaw dane wejściowe na InnerText właściwość elementu głównego zamiast InnerXml właściwości .
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
Jeśli osoba atakująca użyje tego elementu do wprowadzania danych wejściowych: some text<allowedUser>oscar</allowedUser>
, dokument XML będzie następujący:
<root>some text<allowedUser>oscar</allowedUser>
<allowedUser>alice</allowedUser>
</root>
Konfigurowanie kodu do analizowania
Użyj poniższych opcji, aby skonfigurować, które części bazy kodu mają być uruchamiane w tej regule.
Możesz skonfigurować te opcje tylko dla tej reguły, dla wszystkich reguł, do których ma ona zastosowanie, lub dla wszystkich reguł w tej kategorii (Zabezpieczenia), których dotyczy. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.
Wykluczanie określonych symboli
Z analizy można wykluczyć określone symbole, takie jak typy i metody. Aby na przykład określić, że reguła nie powinna być uruchamiana w żadnym kodzie w typach o nazwie MyType
, dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |
):
- Tylko nazwa symbolu (zawiera wszystkie symbole o nazwie, niezależnie od typu zawierającego lub przestrzeni nazw).
- W pełni kwalifikowane nazwy w formacie identyfikatora dokumentacji symbolu. Każda nazwa symboli wymaga prefiksu typu symboli, takiego jak
M:
metody,T:
dla typów iN:
przestrzeni nazw. .ctor
dla konstruktorów i.cctor
konstruktorów statycznych.
Przykłady:
Wartość opcji | Podsumowanie |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Pasuje do wszystkich symboli o nazwie MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Pasuje do wszystkich symboli o nazwie MyType1 lub MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Pasuje do określonej metody MyMethod z określonym w pełni kwalifikowanym podpisem. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Pasuje do określonych metod MyMethod1 i MyMethod2 z odpowiednimi w pełni kwalifikowanymi podpisami. |
Wykluczanie określonych typów i ich typów pochodnych
Z analizy można wykluczyć określone typy i ich typy pochodne. Aby na przykład określić, że reguła nie powinna być uruchamiana na żadnych metodach w typach nazwanych MyType
i ich typach pochodnych, dodaj następującą parę klucz-wartość do pliku .editorconfig w projekcie:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |
):
- Nazwa typu (zawiera tylko wszystkie typy o nazwie, niezależnie od typu zawierającego lub przestrzeni nazw).
- W pełni kwalifikowane nazwy w formacie identyfikatora dokumentacji symbolu z opcjonalnym
T:
prefiksem.
Przykłady:
Wartość opcji | Podsumowanie |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Pasuje do wszystkich typów nazwanych MyType i wszystkich ich typów pochodnych. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Dopasuje wszystkie typy o nazwie MyType1 lub MyType2 i wszystkie ich typy pochodne. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Pasuje do określonego typu MyType z daną w pełni kwalifikowaną nazwą i wszystkimi jego typami pochodnymi. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Pasuje do określonych typów MyType1 i MyType2 z odpowiednimi w pełni kwalifikowanymi nazwami i wszystkimi ich typami pochodnymi. |