Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA3003 |
| Tytuł | Przegląd kodu pod kątem podatności na ataki polegające na wstrzykiwaniu ścieżek plików |
| Kategoria | Bezpieczeństwo |
| Poprawka łamiąca lub nienaruszająca | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Nie. |
| Zastosowane języki | C# i Visual Basic |
Przyczyna
Potencjalnie niezaufane dane wejściowe żądania HTTP docierają do ścieżki operacji pliku.
Domyślnie ta reguła analizuje całą bazę kodu, ale można to skonfigurować.
Opis reguły
Podczas pracy z niezaufanymi danymi wejściowymi z żądań internetowych należy pamiętać o używaniu danych wejściowych kontrolowanych przez użytkownika podczas określania ścieżek do plików. Osoba atakująca może odczytać niezamierzony plik, co spowoduje ujawnienie informacji poufnych danych. Lub osoba atakująca może mieć możliwość zapisu w niezamierzonym pliku, co powoduje nieautoryzowaną modyfikację poufnych danych lub naruszenie bezpieczeństwa serwera. Typową techniką atakującą jest przechodzenie ścieżki w celu uzyskania dostępu do plików spoza zamierzonego katalogu.
Ta reguła próbuje znaleźć dane wejściowe z żądań HTTP docierających do ścieżki w operacji pliku.
Uwaga
Ta reguła nie może śledzić danych między modułami. Jeśli na przykład jeden zestaw odczytuje dane wejściowe żądania HTTP, a następnie przekazuje go do innego zestawu, który zapisuje w pliku, 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
- Jeśli to możliwe, ogranicz ścieżki plików na podstawie danych wejściowych użytkownika do jawnie znanej listy bezpiecznych. Jeśli na przykład aplikacja musi uzyskiwać dostęp tylko do "red.txt", "green.txt" lub "blue.txt", zezwalaj tylko na te wartości.
- Sprawdź niezaufane nazwy plików i sprawdź, czy nazwa jest poprawnie sformułowana.
- Podczas określania ścieżek użyj pełnych nazw ścieżek.
- Unikaj potencjalnie niebezpiecznych konstrukcji, takich jak zmienne środowiskowe ścieżki.
- Zaakceptuj tylko długie nazwy plików i zweryfikuj długą nazwę, jeśli użytkownik przesyła krótkie nazwy.
- Ogranicz wprowadzanie danych wejściowych przez użytkownika końcowego do prawidłowych znaków.
- Odrzuć nazwy, w których przekroczono długość MAX_PATH.
- Obsługuj nazwy plików dosłownie, bez żadnej interpretacji.
- Określ, czy nazwa pliku reprezentuje plik lub urządzenie.
Kiedy pomijać ostrzeżenia
Jeśli sprawdzono dane wejściowe zgodnie z opisem w poprzedniej sekcji, możesz pominąć to ostrzeżenie.
Konfigurowanie kodu do analizowania
Użyj poniższych opcji, aby skonfigurować, na które części bazy kodu ma być stosowana ta reguła.
Możesz skonfigurować te opcje tylko dla tej reguły, dla wszystkich reguł, do których mają zastosowanie, lub dla wszystkich reguł w tej kategorii (Security), do których mają zastosowanie. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.
Wyklucz określone symbole
Z analizy można wykluczyć określone symbole, takie jak typy i metody, ustawiając opcję excluded_symbol_names. 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
Uwaga
Zastąp część XXXXCAXXXX identyfikatorem odpowiedniej reguły.
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 symbolu wymaga prefiksu określającego rodzaj symbolu, takiego jak
M:dla metody,T:dla typów iN:dla przestrzeni nazw. -
.ctordla konstruktorów i.cctordla 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) |
Dopasowuje określoną metodę MyMethod do określonej, w pełni kwalifikowanej sygnatury. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Dopasowuje określone metody MyMethod1 i MyMethod2 z odpowiednimi w pełni kwalifikowanymi sygnaturami. |
Wyklucz określone typy i ich pochodne typy
Określone typy i ich typy pochodne można wykluczyć z analizy, ustawiając opcję excluded_type_names_with_derived_types. 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
Uwaga
Zastąp część XXXXCAXXXX identyfikatorem odpowiedniej reguły.
Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |):
- Podaj tylko nazwę typu (obejmuje wszystkie typy o tej nazwie, bez względu na typ zawierający lub przestrzeń nazw).
- W pełni kwalifikowane nazwy w formacie dokumentacyjnego identyfikatora symbolu, z opcjonalnym prefiksem
T:.
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 |
Dopasowuje określony typ MyType do danej w pełni kwalifikowanej nazwy i do wszystkich jego pochodnych typów. |
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. |
Przykłady pseudokodu
Naruszenie
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