CA5360: Nie należy wywoływać niebezpiecznych metod w deserializacji
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA5360 |
Tytuł | Nie wywołuj niebezpiecznych metod w deserializacji |
Kategoria | Bezpieczeństwo |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Wywołanie jednej z następujących niebezpiecznych metod 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
Wszystkie metody spełniają 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 deserializacji jest luką w zabezpieczeniach, która występuje, gdy niezaufane dane są używane do nadużywania logiki aplikacji, spowodowania ataku typu "odmowa usługi" (DoS), a nawet wykonania dowolnego kodu podczas deserializacji. 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ślne niezabezpieczone ataki deserializacji mogą umożliwić atakującemu przeprowadzenie ataków, takich jak ataki DoS, obejścia uwierzytelniania i 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. Ochrona klucza kryptograficznego przed ujawnieniem i projektowaniem rotacji 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 przykładów kodu przykładowego
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);
}
}