CA5360: Anropa inte farliga metoder vid deserialisering
Property | Värde |
---|---|
Regel-ID | CA5360 |
Title | Anropa inte farliga metoder i deserialisering |
Kategori | Säkerhet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
Anropa någon av följande farliga metoder i deserialisering:
- 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
Alla metoder uppfyller något av följande krav kan vara återanrop av deserialisering:
- Markerad med System.Runtime.Serialization.OnDeserializingAttribute.
- Markerad med System.Runtime.Serialization.OnDeserializedAttribute.
- Implementera System.Runtime.Serialization.IDeserializationCallback.OnDeserialization.
- Implementera System.IDisposable.Dispose.
- Är en destructor.
Regelbeskrivning
Osäker deserialisering är en säkerhetsrisk som uppstår när obetrodda data används för att missbruka logiken i ett program, orsaka en DoS-attack (Denial-of-Service) eller till och med köra godtycklig kod när den deserialiseras. Det är ofta möjligt för skadliga användare att missbruka dessa deserialiseringsfunktioner när programmet deserialiserar ej betrodda data som står under deras kontroll. Mer specifikt anropar du farliga metoder i processen för deserialisering. Lyckade osäkra deserialiseringsattacker kan göra det möjligt för en angripare att utföra attacker som DoS-attacker, förbikoppling av autentisering och körning av fjärrkod.
Så här åtgärdar du överträdelser
Ta bort dessa farliga metoder från att automatiskt köra återanrop till deserialisering. Anropa endast farliga metoder efter validering av indata.
När du ska ignorera varningar
Det är säkert att ignorera den här regeln om:
- Du vet att indata är betrodda. Tänk på att programmets förtroendegräns och dataflöden kan ändras över tid.
- Serialiserade data är manipuleringssäkra. Efter serialiseringen signerar kryptografiskt serialiserade data. Verifiera den kryptografiska signaturen innan deserialiseringen. Skydda den kryptografiska nyckeln från att avslöjas och utformas för nyckelrotationer.
- Data verifieras som säkra för programmet.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA5360
// The code that's violating the rule is on this line.
#pragma warning restore CA5360
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA5360.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel på pseudokod
Kränkning
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);
}
}
Lösning
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);
}
}