CA5403:証明書をハードコーディングしない
プロパティ | 値 |
---|---|
ルール ID | CA5403 |
Title | 証明書をハードコーディングしない |
[カテゴリ] | Security |
修正が中断か中断なしであるか | なし |
.NET 9 では既定で有効 | いいえ |
原因
X509Certificate または X509Certificate2 コンストラクターの data
または rawData
パラメーターが次のいずれかによってハードコーディングされています。
- Byte 配列。
- Char 配列。
- System.Convert.FromBase64String(String)=
- System.Text.Encoding.GetBytes のすべてのオーバーロード。
規則の説明
ハードコーディングされた証明書の秘密キーは簡単に検出されます。 コンパイルされたバイナリでも、悪意のあるユーザーがハードコーディングされた秘密キーを簡単に抽出できます。 秘密キーが侵害されると、攻撃者はその証明書を偽装でき、その証明書によって保護されているすべてのリソースや操作を攻撃者が使用できるようになります。
違反の修正方法
- Azure Key Vault などのセキュリティで保護されたキー管理システムを使用するようにアプリケーションを再設計することを検討します。
- 資格情報と証明書は、ソース コードとは別の安全な場所に保管します。
どのようなときに警告を抑制するか
ハードコーディングされたデータに証明書の秘密キーが含まれていない場合は、この規則による警告を抑制できます。 たとえば、データは .cer
ファイルのものです。 パブリック証明書情報をハードコーディングする場合も、証明書の有効期限が切れたときや失効したときに、証明書のローテーションに関する課題が生じる可能性があります。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA5403
// The code that's violating the rule is on this line.
#pragma warning restore CA5403
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA5403.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
疑似コードの例
byte 配列によるハードコーディング
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);
}
}
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);
}
}
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);
}
}
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);
}
}
解決策
using System.IO;
using System.Security.Cryptography.X509Certificates;
class ExampleClass
{
public void ExampleMethod(string path)
{
new X509Certificate2("Certificate.cer");
}
}
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET