CA5360: No llamar a métodos peligrosos durante la deserialización
Propiedad | Value |
---|---|
Identificador de la regla | CA5360 |
Título | No llamar a métodos peligrosos durante la deserialización |
Categoría | Seguridad |
La corrección interrumpe o no interrumpe | Poco problemático |
Habilitado de forma predeterminada en .NET 8 | No |
Causa
Llamar a uno de los métodos peligrosos siguientes en la deserialización:
- 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
Todos los métodos que cumplen uno de los siguientes requisitos pueden ser la devolución de llamada de deserialización:
- Marcado con System.Runtime.Serialization.OnDeserializingAttribute.
- Marcado con System.Runtime.Serialization.OnDeserializedAttribute.
- Implementando System.Runtime.Serialization.IDeserializationCallback.OnDeserialization.
- Implementando System.IDisposable.Dispose.
- Es un destructor.
Descripción de la regla
La deserialización no segura es una vulnerabilidad que se produce cuando los datos que no son de confianza se usan para realizar un uso indebido de la lógica de una aplicación, provocar un ataque por denegación de servicio (DoS) o incluso ejecutar código arbitrario cuando se deserializa. A menudo, es posible que los usuarios malintencionados usen indebidamente estas características de deserialización cuando la aplicación está deserializando datos que no son de confianza y están bajo su control. En concreto, la invocación de métodos peligrosos en el proceso de deserialización. Los ataques de deserialización no segura realizados correctamente pueden permitir que un atacante lleve a cabo ataques como ataques DoS, omisiones de autenticación y ejecución remota de código.
Cómo corregir infracciones
Evite que estos métodos peligrosos ejecuten automáticamente devoluciones de llamada de deserialización. Llame a métodos peligrosos solo después de validar la entrada.
Cuándo suprimir las advertencias
Se puede suprimir esta regla si:
- Sabe que la entrada es de confianza. Considera que el límite de confianza de la aplicación y los flujos de datos pueden cambiar con el tiempo.
- Los datos serializados están protegidos frente a posibles alteraciones. Después de la serialización, firme criptográficamente los datos serializados. Antes de la deserialización, valide la firma criptográfica. Proteja la clave criptográfica para que no se revele y diseñe las rotaciones de clave.
- Los datos se validan como seguros para la aplicación.
Supresión de una advertencia
Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.
#pragma warning disable CA5360
// The code that's violating the rule is on this line.
#pragma warning restore CA5360
Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none
del archivo de configuración.
[*.{cs,vb}]
dotnet_diagnostic.CA5360.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.
Ejemplos de pseudocódigo
Infracción
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);
}
}
Solución
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);
}
}