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 | CA5360 |
| Tytuł | Nie wywołuj niebezpiecznych metod podczas deserializacji |
| 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
Wywołanie jednej z następujących niebezpiecznych metod podczas deserializacji:
- System.IO.Directory.Delete
- System.IO.DirectoryInfo.Delete
- System.IO.File.AppendAllLines
- System.IO.File.AppendAllText
- System.IO.File.AppendText
- System.IO.File.Copy
- System.IO.File.Delete
- System.IO.File.WriteAllBytes
- System.IO.File.WriteAllLines
- System.IO.File.WriteAllText
- System.IO.FileInfo.Delete
- System.IO.Log.LogStore.Delete
- System.Reflection.Assembly.GetLoadedModules
- System.Reflection.Assembly.Load
- System.Reflection.Assembly.LoadFrom
- System.Reflection.Assembly.LoadFile
- System.Reflection.Assembly.LoadModule
- System.Reflection.Assembly.LoadWithPartialName
- System.Reflection.Assembly.ReflectionOnlyLoad
- System.Reflection.Assembly.ReflectionOnlyLoadFrom
- System.Reflection.Assembly.UnsafeLoadFrom
Każda metoda, która spełnia jedno z następujących wymagań, może być wywołaniem zwrotnym deserializacji:
- Oznaczone znakiem System.Runtime.Serialization.OnDeserializingAttribute.
- Oznaczone znakiem System.Runtime.Serialization.OnDeserializedAttribute.
- Implementowanie System.Runtime.Serialization.IDeserializationCallback.OnDeserialization.
- Implementowanie System.IDisposable.Dispose.
- Jest destruktorem.
Opis reguły
Niezabezpieczona deserializacja jest luką w zabezpieczeniach, która występuje, gdy niezaufane dane są używane dla nadużycia logiki aplikacji, przeprowadzenia ataku typu "odmowa usługi" (DoS) lub nawet wykonania dowolnego kodu, gdy są deserializowane. Złośliwi użytkownicy często mogą nadużywać tych funkcji deserializacji, gdy aplikacja deserializuje niezaufane dane, które są pod ich kontrolą. W szczególności należy wywołać niebezpieczne metody w procesie deserializacji. Pomyślna niezabezpieczona deserializacja może umożliwić atakującemu przeprowadzenie takich ataków, jak DoS, obejścia uwierzytelniania oraz zdalne wykonywanie kodu.
Jak naprawić naruszenia
Usuń te niebezpieczne metody z automatycznego uruchamiania wywołań zwrotnych deserializacji. Wywołaj niebezpieczne metody dopiero po zweryfikowaniu danych wejściowych.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć tę regułę, jeśli:
- Wiesz, że dane wejściowe są zaufane. Należy wziąć pod uwagę, że granica zaufania aplikacji i przepływy danych mogą ulec zmianie w czasie.
- Serializowane dane są odporne na naruszenia. Po serializacji kryptograficznie podpisz serializowane dane. Przed deserializacji zweryfikuj podpis kryptograficzny. Chroń klucz kryptograficzny przed ujawnieniem i zaprojektuj rotacje kluczy.
- Dane są weryfikowane jako bezpieczne dla aplikacji.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA5360
// The code that's violating the rule is on this line.
#pragma warning restore CA5360
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA5360.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykłady pseudokodu
Naruszenie
using System;
using System.IO;
using System.Runtime.Serialization;
[Serializable()]
public class ExampleClass : IDeserializationCallback
{
private string member;
void IDeserializationCallback.OnDeserialization(Object sender)
{
var sourceFileName = "malicious file";
var destFileName = "sensitive file";
File.Copy(sourceFileName, destFileName);
}
}
Rozwiązanie
using System;
using System.IO;
using System.Runtime.Serialization;
[Serializable()]
public class ExampleClass : IDeserializationCallback
{
private string member;
void IDeserializationCallback.OnDeserialization(Object sender)
{
var sourceFileName = "malicious file";
var destFileName = "sensitive file";
// Remove the potential dangerous operation.
// File.Copy(sourceFileName, destFileName);
}
}