Bagikan melalui


CA5403: Jangan mengodekan sertifikat secara permanen

Properti Nilai
ID Aturan CA5403
Judul Jangan me-hardcode sertifikat
Golongan Keamanan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 9 No

Penyebab

Parameter datarawDataX509Certificate atau X509Certificate2 konstruktor dikodekan secara permanen oleh salah satu hal berikut:

Deskripsi aturan

Kunci privat sertifikat yang dikodekan secara permanen mudah ditemukan. Bahkan dengan biner yang dikompilasi, mudah bagi pengguna jahat untuk mengekstrak kunci privat sertifikat yang dikodekan secara permanen. Setelah kunci privat disusupi, penyerang dapat meniru sertifikat tersebut, dan sumber daya atau operasi apa pun yang dilindungi oleh sertifikat tersebut akan tersedia untuk penyerang.

Cara memperbaiki pelanggaran

  • Pertimbangkan untuk mendesain ulang aplikasi Anda untuk menggunakan sistem manajemen kunci yang aman, seperti Azure Key Vault.
  • Jaga kredensial dan sertifikat di lokasi yang aman terpisah dari kode sumber Anda.

Kapan harus menekan peringatan

Aman untuk menekan peringatan dari aturan ini jika data yang dikodekan secara permanen tidak berisi kunci privat sertifikat. Misalnya, data berasal dari .cer file. Informasi sertifikat publik hard-coding mungkin masih menciptakan tantangan untuk memutar sertifikat saat kedaluwarsa atau dicabut.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

#pragma warning disable CA5403
// The code that's violating the rule is on this line.
#pragma warning restore CA5403

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA5403.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Contoh kode semu

Array byte yang dikodekan secara permanen

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

Dikodekan secara permanen oleh array karakter

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

Dikodekan secara permanen oleh 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);
    }
}

Dikodekan secara permanen oleh 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);
    }
}

Solusi

using System.IO;
using System.Security.Cryptography.X509Certificates;

class ExampleClass
{
    public void ExampleMethod(string path)
    {
        new X509Certificate2("Certificate.cer");
    }
}