CA5360: Geen gevaarlijke methoden aanroepen in deserialisatie
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA5360 |
Titel | Geen gevaarlijke methoden aanroepen in deserialisatie |
Categorie | Beveiliging |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Het aanroepen van een van de volgende gevaarlijke methoden in deserialisatie:
- 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
Alle methoden voldoen aan een van de volgende vereisten kunnen de callback van deserialisatie zijn:
- Gemarkeerd met System.Runtime.Serialization.OnDeserializingAttribute.
- Gemarkeerd met System.Runtime.Serialization.OnDeserializedAttribute.
- Implementeren System.Runtime.Serialization.IDeserializationCallback.OnDeserialization.
- Implementeren System.IDisposable.Dispose.
- Is een destructor.
Beschrijving van regel
Onveilig deserialisatie is een beveiligingsprobleem dat optreedt wanneer niet-vertrouwde gegevens worden gebruikt om de logica van een toepassing te misbruiken, een DoS-aanval (Denial-of-Service) toe te brengen of zelfs willekeurige code uit te voeren wanneer deze wordt gedeserialiseerd. Het is vaak mogelijk dat kwaadwillende gebruikers deze deserialisatiefuncties misbruiken wanneer de toepassing niet-vertrouwde gegevens deserialiseert die onder hun beheer valt. Roep met name gevaarlijke methoden aan bij het deserialisatieproces. Met geslaagde onveilige deserialisatieaanvallen kan een aanvaller aanvallen uitvoeren, zoals DoS-aanvallen, verificatie-bypasss en uitvoering van externe code.
Schendingen oplossen
Verwijder deze gevaarlijke methoden uit het automatisch uitvoeren van callbacks voor deserialisatie. Roep gevaarlijke methoden alleen aan nadat de invoer is geverifieerd.
Wanneer waarschuwingen onderdrukken
Het is veilig om deze regel te onderdrukken als:
- U weet dat de invoer wordt vertrouwd. Houd er rekening mee dat de vertrouwensgrens en gegevensstromen van uw toepassing na verloop van tijd kunnen veranderen.
- De geserialiseerde gegevens zijn manipulatiebestendig. Na serialisatie tekent u de geserialiseerde gegevens cryptografisch. Voordat deserialisatie wordt gedeserialiseerd, valideert u de cryptografische handtekening. Beveilig de cryptografische sleutel tegen openbaarmaking en ontwerp voor sleutelrotaties.
- De gegevens worden gevalideerd als veilig voor de toepassing.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA5360
// The code that's violating the rule is on this line.
#pragma warning restore CA5360
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA5360.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.
Voorbeelden van pseudocode
Schending
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);
}
}
Oplossing
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);
}
}