CA5403: Não embutir o certificado em código
Property | Valor |
---|---|
ID da regra | CA5403 |
Título | Não embutir o certificado em código |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Não |
Causa
O parâmetro data
ou rawData
de um construtor X509Certificate ou X509Certificate2 é embutido em código por um dos seguintes:
- Matriz de bytes.
- Matriz de caracteres.
- System.Convert.FromBase64String(String).
- Todas as sobrecargas de System.Text.Encoding.GetBytes.
Descrição da regra
A chave privada de um certificado embutido em código é facilmente descoberta. Mesmo com binários compilados, é fácil para usuários mal-intencionados extrair a chave privada de um certificado embutido em código. Depois que a chave privada for comprometida, um invasor poderá representar esse certificado e todos os recursos ou operações protegidos por esse certificado estarão disponíveis para o invasor.
Como corrigir violações
- Considere reprojetar o 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
Suprimir um aviso dessa regra será seguro se os dados embutidos em código não contiverem a chave privada do certificado. Por exemplo, os dados são de um arquivo.cer
. As informações de certificado público embutido em código ainda poderão criar um desafio para a rotação de certificados à medida que expiram ou são revogados.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA5403.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Exemplos de pseudocódigo
Embutido em código 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);
}
}
Embutido em código 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);
}
}
Embutido em código 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);
}
}
Embutido em código 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");
}
}