CA5403: No codificar el certificado de forma rígida
Propiedad | Value |
---|---|
Identificador de la regla | CA5403 |
Título | No codificar el certificado de forma rígida |
Categoría | Seguridad |
La corrección interrumpe o no interrumpe | Poco problemático |
Habilitado de forma predeterminada en .NET 8 | No |
Causa
El parámetro data
o rawData
de un constructor X509Certificate o X509Certificate2 está codificado de forma rígida mediante una de las siguientes acciones:
- Matriz de bytes.
- Matriz de caracteres.
- System.Convert.FromBase64String(String).
- Todas las sobrecargas de System.Text.Encoding.GetBytes.
Descripción de la regla
Una clave privada del certificado codificado de forma rígida se detecta fácilmente. Incluso con los archivos binarios compilados, es fácil que los usuarios malintencionados extraigan la clave privada de un certificado codificado de forma rígida. Una vez que la clave privada está en peligro, un atacante puede suplantar el certificado y todos los recursos u operaciones protegidos por dicho certificado estarán disponibles para el atacante.
Cómo corregir infracciones
- Considere la posibilidad de volver a diseñar la aplicación para que use un sistema de administración de claves seguro, como Azure Key Vault.
- Mantenga las credenciales y los certificados en una ubicación segura independiente del código fuente.
Cuándo suprimir las advertencias
Se puede suprimir una advertencia de esta regla si los datos codificados de forma rígida no contienen la clave privada del certificado. Por ejemplo, los datos provienen de un archivo .cer
. Es posible que la información del certificado público de codificación rígida siga creando un desafío para rotar los certificados a medida que expiran o se revocan.
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 CA5403
// The code that's violating the rule is on this line.
#pragma warning restore CA5403
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.CA5403.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.
Ejemplos de pseudocódigo
Codificado de forma rígida por matriz de bytes
using System.IO;
using System.Security.Cryptography.X509Certificates;
class ExampleClass
{
public void ExampleMethod(string path)
{
byte[] bytes = new byte[] {1, 2, 3};
File.WriteAllBytes(path, bytes);
new X509Certificate2(path);
}
}
Codificado de forma rígida por matriz de caracteres
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Text;
class ExampleClass
{
public void ExampleMethod(byte[] bytes, string path)
{
char[] chars = new char[] { '1', '2', '3' };
Encoding.ASCII.GetBytes(chars, 0, 3, bytes, 0);
File.WriteAllBytes(path, bytes);
new X509Certificate2(path);
}
}
Codificado de forma rígida por FromBase64String
using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
class ExampleClass
{
public void ExampleMethod(string path)
{
byte[] bytes = Convert.FromBase64String("AAAAAaazaoensuth");
File.WriteAllBytes(path, bytes);
new X509Certificate2(path);
}
}
Codificado de forma rígida por GetBytes
using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Text;
class ExampleClass
{
public void ExampleMethod(string path)
{
byte[] bytes = Encoding.ASCII.GetBytes("AAAAAaazaoensuth");
File.WriteAllBytes(path, bytes);
new X509Certificate2(path);
}
}
Solución
using System.IO;
using System.Security.Cryptography.X509Certificates;
class ExampleClass
{
public void ExampleMethod(string path)
{
new X509Certificate2("Certificate.cer");
}
}