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:

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");
    }
}