Json.Net TypeNameHandling を Auto に設定すると、外部 JSON データが脅威となる可能性がありますか?
JSON 逆シリアル化における、Json の TypeNameHandling 設定。ネットは、潜在的な脅威を軽減する上で重要な役割を果たします。ただし、ユーザーが提供した JSON データでこの設定を使用する場合の安全性については懸念が残ります。この問題を詳しく調べて、潜在的なリスクと予防策を検討してみましょう。
TypeNameHandling の脆弱性
外部 JSON ペイロードは、次のことを指定する "$type" プロパティを含めるように操作される可能性があります。逆シリアル化用の型。これらのタイプが注意深く検証されていない場合、攻撃者はそれらを悪用して「攻撃ガジェット」と呼ばれる不正なオブジェクトをインスタンス化する可能性があります。これらのガジェットは、リモート コード実行 (RCE) やファイル システム操作などの悪意のあるアクションを実行する可能性があります。
保護措置
Json.Net は、そのような攻撃を防ぐための安全対策を実装しています。 :
-
不明なプロパティの無知: それ不明なプロパティを無視し、無関係な "$type" プロパティを持つ JSON ペイロードを無害にレンダリングします。
-
シリアル化互換性: 多態性値の逆シリアル化中に、解決された型が予期された型と一致するかどうかを確認します。そうでない場合は、例外がスローされます。
潜在的な抜け穴
これらの対策を講じたにもかかわらず、特定の状況では、たとえ明らかに型なしのメンバーが存在しない:
-
Untypedコレクション: ArrayList、List
-
半型付きコレクション:ランタイム型検証をサポートする CollectionBase から派生したコレクションを逆シリアル化すると、ガジェット用のウィンドウが作成される可能性があります
-
共有基本タイプ: 攻撃ガジェット (ICollection、IDisposable など) によって共有されるインターフェイスまたは基本タイプとして宣言された多態性メンバーは、脆弱性を引き起こす可能性があります。
-
ISerializable インターフェイス: ISerializable を実装する型は、意図せずに型なしのメンバーを逆シリアル化し、攻撃にさらします。
-
条件付きシリアル化: ShouldSerializeAttribute で非シリアル化としてマークされたメンバーは、JSON 内に存在する場合は逆シリアル化される可能性があります。ペイロード。
推奨事項
リスクを最小限に抑えるには、次の推奨事項を考慮してください。
-
不明な型の検証: カスタム SerializationBinder を実装して、受信するシリアル化された型をチェックし、未承認のものを拒否します。
-
型指定されていないメンバーの回避: データがモデルには、オブジェクト型、動的型、またはその他の悪用される可能性のある型のメンバーが含まれていませんtype.
-
Set DefaultContractResolver: DefaultContractResolver.IgnoreSerializableInterface および DefaultContractResolver.IgnoreSerializableAttribute を true に設定することを検討してください。
-
シリアル化されていないメンバーのコードを確認してください:非シリアル化としてマークされたメンバーが予期しない状況で逆シリアル化されないことを確認します。
これらのベスト プラクティスに従うことで、Json.Net TypeNameHandling セットを通じて外部 JSON データがシステムを侵害する可能性を大幅に減らすことができます。自動にします。
以上がJson.Net の「TypeNameHandling」設定 (自動) は外部 JSON データ攻撃に対して脆弱ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。