外部 JSON 公開: Json.Net による TypeNameHandling のリスクを理解する
自動型処理による JSON 逆シリアル化は、セキュリティ上の脅威を引き起こす可能性があります。この記事は、Json.Net で Auto に設定された TypeNameHandling を使用する場合の潜在的な脆弱性を明確にすることを目的としています。
Json.Net の TypeNameHandling について
TypeNameHandling による JSON の制御方法。 Net は、インスタンス化する型の完全修飾名を指定する「$type」プロパティを使用して型を逆シリアル化します。 Auto に設定すると、Json.Net は指定された型を解決してインスタンスを構築しようとします。
潜在的な危険
データ モデルに直接オブジェクトまたは動的メンバーがないと、逆シリアル化攻撃から保護されていると想定することもできます。ただし、特定のシナリオでは依然としてリスクが生じる可能性があります。
-
型なしコレクション: ArrayList や List
-
CollectionBase: CollectionBase から継承した型により、ランタイム アイテム検証が可能になり、攻撃ガジェット構築の潜在的な抜け穴が作成されます。
-
共有ベース タイプ: 攻撃ガジェットによって共有されるベース タイプまたはインターフェイスを持つポリモーフィックな値は、次の影響を受けやすくなります。逆シリアル化攻撃。
-
ISerializable 型: ISerializable を実装する型は、Exception.Data ディクショナリを含む、型なしのメンバーを逆シリアル化する可能性があります。
-
条件付きシリアル化: マークされたメンバーShouldSerialize メソッド経由でシリアル化されていない場合でも、 JSON 入力に存在する場合は逆シリアル化されます。
軽減策
セキュリティを強化するには、次の点を考慮してください。
-
Custom SerializationBinder: 検証するカスタム SerializationBinder を実装します。予期される型を定義し、予期しない型の逆シリアル化を防ぎます。
-
TypeNameHandling.None: TypeNameHandling を None に設定することを検討してください。これにより、逆シリアル化中の型解決が効果的に無効になります。
-
警告予期しない/非表示の入力: 型指定されていないメンバーまたは非表示のシリアル化に注意してください
-
デフォルトのシリアル化コントラクトを無効にする: DefaultContractResolver.IgnoreSerializableInterface または DefaultContractResolver.IgnoreSerializableAttribute を次のように設定しないようにします。 false。
結論
Json.Net の特定のメカニズムは脆弱性の軽減に役立ちますが、外部 JSON 逆シリアル化における TypeNameHandling によってもたらされる潜在的なリスクを慎重に考慮することが重要です。カスタム SerializationBinder の実装やデータ モデルの型指定の検証など、推奨される予防策に従うことで、Json.Net の機能を利用しながらアプリケーションのセキュリティを強化できます。
以上がJson.Net の TypeNameHandling を使用した JSON 逆シリアル化はどの程度安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。