CA5403: Não codificar certificado
Property | valor |
---|---|
ID da regra | CA5403 |
Título | Não codificar certificado |
Categoria | Segurança |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Não |
Motivo
O data
parâmetro ou rawData
de um X509Certificate construtor ou X509Certificate2 é codificado por um dos seguintes:
- Matriz de bytes.
- Matriz Char.
- System.Convert.FromBase64String(String).
- Todas as sobrecargas de System.Text.Encoding.GetBytes.
Descrição da regra
A chave privada de um certificado codificado é facilmente descoberta. Mesmo com binários compilados, é fácil para usuários mal-intencionados extrair a chave privada de um certificado codificado. Depois que a chave privada for comprometida, um invasor poderá se passar por esse certificado, e quaisquer recursos ou operações protegidos por esse certificado estarão disponíveis para o invasor.
Como corrigir violações
- Considere reprojetar seu aplicativo para usar um sistema de gerenciamento de chaves seguro, como o Azure Key Vault.
- Mantenha as credenciais e os certificados em um local seguro separado do código-fonte.
Quando suprimir avisos
É seguro suprimir um aviso dessa regra se os dados codificados não contiverem a chave privada do certificado. Por exemplo, os dados são de um .cer
arquivo. A codificação de informações de certificados públicos ainda pode criar um desafio para a rotação de certificados à medida que expiram ou são revogados.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable CA5403
// The code that's violating the rule is on this line.
#pragma warning restore CA5403
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA5403.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Exemplos de pseudocódigo
Codificado 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 por matriz char
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 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 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);
}
}
Solução
using System.IO;
using System.Security.Cryptography.X509Certificates;
class ExampleClass
{
public void ExampleMethod(string path)
{
new X509Certificate2("Certificate.cer");
}
}