CA2326: None 以外の TypeNameHandling 値は使用しないでください
プロパティ | 値 |
---|---|
ルール ID | CA2326 |
Title | None 以外の TypeNameHandling 値は使用しないでください |
[カテゴリ] | Security |
修正が中断か中断なしであるか | なし |
.NET 8 では既定で有効 | いいえ |
原因
この規則は、次のいずれかの条件に該当する場合に適用されます。
None
ではなく、Newtonsoft.Json.TypeNameHandling 列挙値が参照されている。- ゼロ以外の値を表す整数値が TypeNameHandling 変数に割り当てられている。
規則の説明
安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 たとえば、安全でない逆シリアライザーに対する攻撃では、基になるオペレーティング システムでコマンドが実行されたり、ネットワークを介して通信されたり、ファイルを削除されたりする可能性があります。
この規則により、None
以外の Newtonsoft.Json.TypeNameHandling 値が検出されます。 逆シリアル化された型を制限するために Newtonsoft.Json.Serialization.ISerializationBinder が指定されている場合にのみ逆シリアル化する場合は、この規則を無効にし、代わりに規則 CA2327、CA2328、CA2329、および CA2330 を有効にしてください。
違反の修正方法
- 可能な場合は、TypeNameHandling の
None
値を使用します。 - シリアル化されたデータを改ざん防止にします。 シリアル化後に、シリアル化されたデータに暗号化署名します。 逆シリアル化する前に、暗号化署名を検証します。 暗号化キーの開示を防止し、キーのローテーションを設計します。
- 逆シリアル化された型を制限します。 カスタム Newtonsoft.Json.Serialization.ISerializationBinder を実装します。 Json.NET を使用して逆シリアル化する前に、カスタム ISerializationBinder を Newtonsoft.Json.JsonSerializerSettings.SerializationBinder プロパティ内で確実に指定します。 オーバーライドされた Newtonsoft.Json.Serialization.ISerializationBinder.BindToType メソッドでは、型が予期したものでない場合、
null
を返すか、例外をスローして逆シリアル化を停止します。- 逆シリアル化された型を制限する場合は、この規則を無効にして、規則 CA2327、CA2328、CA2329、CA2330 を有効にすることができます。 規則 CA2327、CA2328、CA2329、CA2330 は、
None
以外の TypeNameHandling の値を使用する場合に、ISerializationBinder を使用できることを確認するのに役立ちます。
- 逆シリアル化された型を制限する場合は、この規則を無効にして、規則 CA2327、CA2328、CA2329、CA2330 を有効にすることができます。 規則 CA2327、CA2328、CA2329、CA2330 は、
どのようなときに警告を抑制するか
次の場合は、このルールの警告を抑制できます。
- 入力が信頼されていることがわかっている。 アプリケーションの信頼境界とデータ フローは時間の経過と共に変わる可能性があることを考慮する。
- 違反を修正する方法のいずれかの予防措置を講じた。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA2326
// The code that's violating the rule is on this line.
#pragma warning restore CA2326
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA2326.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
疑似コードの例
違反
using Newtonsoft.Json;
public class ExampleClass
{
public JsonSerializerSettings Settings { get; }
public ExampleClass()
{
Settings = new JsonSerializerSettings();
Settings.TypeNameHandling = TypeNameHandling.All; // CA2326 violation.
}
}
Imports Newtonsoft.Json
Public Class ExampleClass
Public ReadOnly Property Settings() As JsonSerializerSettings
Public Sub New()
Settings = New JsonSerializerSettings()
Settings.TypeNameHandling = TypeNameHandling.All ' CA2326 violation.
End Sub
End Class
解決策
using Newtonsoft.Json;
public class ExampleClass
{
public JsonSerializerSettings Settings { get; }
public ExampleClass()
{
Settings = new JsonSerializerSettings();
// The default value of Settings.TypeNameHandling is TypeNameHandling.None.
}
}
Imports Newtonsoft.Json
Public Class ExampleClass
Public ReadOnly Property Settings() As JsonSerializerSettings
Public Sub New()
Settings = New JsonSerializerSettings()
' The default value of Settings.TypeNameHandling is TypeNameHandling.None.
End Sub
End Class
関連規則
CA2327: 安全でない JsonSerializerSettings を使用しないでください
CA2328: JsonSerializerSettings が安全であることを確認してください
CA2329: セキュリティで保護されていない構成が JsonSerializer で使用されている場合は、逆シリアル化を行わないでください
.NET