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 data
rawData
X509Certificate atau X509Certificate2 konstruktor dikodekan secara permanen oleh salah satu hal berikut:
- Array byte.
- Array karakter.
- System.Convert.FromBase64String(String).
- Semua kelebihan beban System.Text.Encoding.GetBytes.
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");
}
}