CA2315: Nepoužívejte nezabezpečený deserializátor ObjectStateFormatter
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2315 |
Název | Nepoužívat nezabezpečený deserializátor ObjectStateFormatter |
Kategorie | Zabezpečení |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | No |
Příčina
Byla System.Web.UI.ObjectStateFormatter volána nebo odkazována metoda deserializace.
Popis pravidla
Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky. Útok na nezabezpečený deserializátor může například spouštět příkazy v podkladovém operačním systému, komunikovat přes síť nebo odstraňovat soubory.
Toto pravidlo najde System.Web.UI.ObjectStateFormatter volání nebo odkazy metody deserializace.
Jak opravit porušení
Pokud je to možné, použijte místo toho zabezpečený serializátor a nepovolte útočníkovi určit libovolný typ, který se má deserializovat. Mezi bezpečnější serializátory patří:
- System.Runtime.Serialization.DataContractSerializer
- System.Runtime.Serialization.Json.DataContractJsonSerializer
- System.Web.Script.Serialization.JavaScriptSerializer - Nikdy nepoužívejte System.Web.Script.Serialization.SimpleTypeResolver. Pokud musíte použít překladač typů, omezte deserializované typy na očekávaný seznam.
- System.Xml.Serialization.XmlSerializer
- Newtonsoft Json.NET – použijte TypeNameHandling.None. Pokud pro TypeNameHandling musíte použít jinou hodnotu, omezte deserializované typy na očekávaný seznam pomocí vlastní ISerializationBinder.
- Vyrovnávací paměti protokolů
Zfalšujte serializovaná data a zfalšujte je. Po serializaci kryptograficky podepisujte serializovaná data. Před deserializací ověřte kryptografický podpis. Chraňte kryptografický klíč před zveřejněním a návrhem obměny klíčů.
Kdy potlačit upozornění
Upozornění z tohoto pravidla je bezpečné potlačit, pokud:
- Víte, že vstup je důvěryhodný. Vezměte v úvahu, že hranice důvěryhodnosti vaší aplikace a toky dat se můžou v průběhu času měnit.
- Provedli jste jedno z bezpečnostních opatření v části Jak opravit porušení.
Příklady pseudokódu
Porušení
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