CA5360: Non chiamare metodi pericolosi nella deserializzazione
Proprietà | valore |
---|---|
ID regola | CA5360 |
Title | Non chiamare metodi pericolosi durante la deserializzazione |
Categoria | Sicurezza |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Causa
Chiamata di uno dei metodi pericolosi seguenti nella deserializzazione:
- 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
Tutti i metodi soddisfano uno dei requisiti seguenti possono essere il callback della deserializzazione:
- Contrassegnato con System.Runtime.Serialization.OnDeserializingAttribute.
- Contrassegnato con System.Runtime.Serialization.OnDeserializedAttribute.
- Implementazione di System.Runtime.Serialization.IDeserializationCallback.OnDeserialization.
- Implementazione di System.IDisposable.Dispose.
- Distruttore.
Descrizione regola
La deserializzazione non sicura è una vulnerabilità che si verifica quando i dati non attendibili vengono usati per abusare della logica di un'applicazione, infliggere un attacco Denial of Service (DoS) o persino eseguire codice arbitrario al momento della deserializzazione. È spesso possibile che gli utenti malintenzionati abusino di queste funzionalità di deserializzazione quando l'applicazione deserializzare i dati non attendibili che sono sotto il loro controllo. In particolare, richiamare metodi pericolosi nel processo di deserializzazione. Gli attacchi di deserializzazione non sicuri potrebbero consentire a un utente malintenzionato di eseguire attacchi come attacchi DoS, bypass di autenticazione ed esecuzione remota del codice.
Come correggere le violazioni
Rimuovere questi metodi pericolosi dall'esecuzione automatica dei callback di deserializzazione. Chiamare metodi pericolosi solo dopo la convalida dell'input.
Quando eliminare gli avvisi
È possibile eliminare questa regola in modo sicuro se:
- Si sa che l'input è attendibile. Si consideri che i limiti di attendibilità e i flussi di dati dell'applicazione possono cambiare nel tempo.
- I dati serializzati sono a prova di manomissione. Dopo la serializzazione, firmare in modo crittografico i dati serializzati. Prima della deserializzazione, convalidare la firma crittografica. Proteggere la chiave crittografica dalla divulgazione e dalla progettazione per le rotazioni delle chiavi.
- I dati vengono convalidati come sicuri per l'applicazione.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA5360
// The code that's violating the rule is on this line.
#pragma warning restore CA5360
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none
su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA5360.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.
Esempi di pseudo-codice
Violazione
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);
}
}
Soluzione
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);
}
}