| プロパティ | 値 |
|---|---|
| ルール ID | CA2326 |
| Title | None 以外の TypeNameHandling 値は使用しないでください |
| [カテゴリ] | Security |
| 修正が破壊的変更か非破壊的変更であるか | なし |
| .NET 10 で既定で有効 | いいえ |
| 該当する言語 | C# と Visual Basic |
原因
この規則は、次のいずれかの条件に該当する場合に適用されます。
-
Newtonsoft.Json.TypeNameHandling 列挙の値として、
None以外のものが参照されています。 - ゼロ以外の値を表す整数値が TypeNameHandling 変数に割り当てられている。
規則の説明
安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 たとえば、安全でない逆シリアライザーに対する攻撃では、基になるオペレーティング システムでコマンドが実行されたり、ネットワークを介して通信されたり、ファイルを削除されたりする可能性があります。
この規則は、Newtonsoft.Json.TypeNameHandling の値が None とは異なる場合を検出します。 逆シリアル化された型を制限するために 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 は、ISerializationBinder を使用して、TypeNameHandling の他の値を使用する場合に、
Noneを適切に使用することを保証します。
- 逆シリアル化された型を制限する場合は、この規則を無効にして、規則 CA2327、CA2328、CA2329、CA2330 を有効にすることができます。 規則 CA2327、CA2328、CA2329、CA2330 は、ISerializationBinder を使用して、TypeNameHandling の他の値を使用する場合に、
どのようなときに警告を抑制するか
次の場合は、このルールの警告を抑制できます。
- 入力が信頼されていることがわかっている。 アプリケーションの信頼境界とデータ フローは時間の経過と共に変わる可能性があることを考慮する。
- 違反を修正する方法のいずれかの予防措置を講じた。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#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