CA5360 : Ne pas appeler de méthodes dangereuses dans la désérialisation
Propriété | Value |
---|---|
Identificateur de la règle | CA5360 |
Titre | Ne pas appeler de méthodes dangereuses dans la désérialisation |
Catégorie | Sécurité |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Non |
Cause
Appel de l’une des méthodes dangereuses suivantes dans la désérialisation :
- 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
Toutes les méthodes répondent à l’une des exigences suivantes, il peut s’agir du rappel de désérialisation :
- Marqué avec System.Runtime.Serialization.OnDeserializingAttribute.
- Marqué avec System.Runtime.Serialization.OnDeserializedAttribute.
- Implémentation de System.Runtime.Serialization.IDeserializationCallback.OnDeserialization.
- Implémentation de System.IDisposable.Dispose.
- Est un destructeur.
Description de la règle
La désérialisation non sécurisée est une vulnérabilité qui se produit lorsque des données non approuvées sont utilisées pour abuser de la logique d’une application, infliger une attaque par déni de service (DoS) ou même exécuter du code arbitraire lors de leur désérialisation. Il est souvent possible pour les utilisateurs malveillants d’abuser de ces fonctionnalités de désérialisation lorsque l’application désérialise des données non approuvées qui sont sous leur contrôle. Plus précisément, appelez des méthodes dangereuses dans le processus de désérialisation. Les attaques de désérialisation non sécurisée réussies pourraient permettre à un attaquant d’effectuer des attaques telles que les attaques par déni de service, les contournements d’authentification et l’exécution de code à distance.
Comment corriger les violations
Supprimez ces méthodes dangereuses de l’exécution automatique dans les rappels de désérialisation. Appelez des méthodes dangereuses uniquement après avoir validé l’entrée.
Quand supprimer les avertissements
Vous pouvez supprimer cette règle en toute sécurité si :
- Vous savez que l’entrée est approuvée. Tenez compte du fait que la limite de confiance et les flux de données de votre application peuvent changer au fil du temps.
- Les données sérialisées sont inviolables. Après la sérialisation, signez par chiffrement les données sérialisées. Avant la désérialisation, validez la signature de chiffrement. Protégez la clé de chiffrement contre la divulgation et concevez un mécanisme de rotations des clés.
- Les données sont validées comme étant sécurisées pour l’application.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA5360
// The code that's violating the rule is on this line.
#pragma warning restore CA5360
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA5360.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Exemples de pseudo-code
Violation
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);
}
}
Solution
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);
}
}