CA2315: Använd inte osäker deserializer ObjectStateFormatter
Property | Värde |
---|---|
Regel-ID | CA2315 |
Title | Använd inte osäker deserializer ObjectStateFormatter |
Kategori | Säkerhet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En System.Web.UI.ObjectStateFormatter deserialiseringsmetod anropades eller refererades till.
Regelbeskrivning
Osäkra deserialiserare är sårbara när deserialisera ej betrodda data. En angripare kan ändra serialiserade data så att de innehåller oväntade typer för att mata in objekt med skadliga biverkningar. En attack mot en osäker deserialiserare kan till exempel köra kommandon på det underliggande operativsystemet, kommunicera via nätverket eller ta bort filer.
Den här regeln hittar System.Web.UI.ObjectStateFormatter deserialiseringsmetodanrop eller referenser.
Så här åtgärdar du överträdelser
Om möjligt använder du en säker serialiserare i stället och tillåter inte att en angripare anger en godtycklig typ att deserialisera. Några säkrare serialiserare är:
- System.Runtime.Serialization.DataContractSerializer
- System.Runtime.Serialization.Json.DataContractJsonSerializer
- System.Web.Script.Serialization.JavaScriptSerializer - Använd System.Web.Script.Serialization.SimpleTypeResolveraldrig . Om du måste använda en typlösare begränsar du deserialiserade typer till en förväntad lista.
- System.Xml.Serialization.XmlSerializer
- Newtonsoft Json.NET – Använd TypeNameHandling.None. Om du måste använda ett annat värde för TypeNameHandling begränsar du deserialiserade typer till en förväntad lista med en anpassad ISerializationBinder.
- Protocol Buffers
Gör serialiserade data 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.
När du ska ignorera varningar
Det är säkert att ignorera en varning från 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.
- Du har vidtagit en av försiktighetsåtgärderna i Så här åtgärdar du överträdelser.
Exempel på pseudokod
Kränkning
using System.IO;
using System.Web.UI;
public class ExampleClass
{
public object MyDeserialize(byte[] bytes)
{
ObjectStateFormatter formatter = new ObjectStateFormatter();
return formatter.Deserialize(new MemoryStream(bytes));
}
}
Imports System.IO
Imports System.Web.UI
Public Class ExampleClass
Public Function MyDeserialize(bytes As Byte()) As Object
Dim formatter As ObjectStateFormatter = New ObjectStateFormatter()
Return formatter.Deserialize(New MemoryStream(bytes))
End Function
End Class