上記のように、コードは”スレッド”メイン”javaで例外”というエラーを出します。ラングClassCastException:テストセリアライゼーション。ExploitDeserをtestserializationにキャストすることはできません。Employee”これは、型キャストが適切ではないことを意味しますが、コードはまだ実行されます。 DeserializeDemoクラスのreadObject関数は、ExploitDeserクラスのreadObjectのカスタム実装を実行できます。,
これは、readObjectのカスタム実装を持つカスタムクラスのシリアル化されたデータが入力として提供されている場合、型キャストエラーがまだあるにもかかわらず、上記のように実行されるという、ここでは安全でない逆シリアル化とは何ですか。
これは、ysoserialやその他のjava逆シリアル化開発ツールで使用されるガジェットチェーンによって行われるもので、クラスの連鎖を探して、ユーザー入力の一部として提供されるシステムレベルのコードを実行できるreadObjectのカスタム実装に最終的に着陸します。,
Remediation
さて、デシリアル化とは何か、そしてそれがどのように悪用されるのかを見てきましたが、これに対する修復を見てみましょう。
ここで説明しようとしている修復は”先読みクラス検証”と呼ばれ、逆シリアル化したいクラスのリストをホワイトリストに登録できます。 例えば。 当社のシナリオばしていくことも期待されるのみ許可する設定を行う従業員のclassオブジェクトのデータを直列化復元および残存ですることを認めるべきではない直列化復元.,したがって、基本的にこのメソッドが行うことは、”ObjectInputStream”(逆シリアル化中に使用)クラスの一部である関数”resolveClass”をオーバーライドし、逆シリアル化する必要があるclassessのリストのホワイトリストを実行することです。
この理論が終わったので、実装にジャンプしましょう。,
新しいクラス”LookAheadObjectInputStream”を作成して、メンバー関数resolveClassをオーバーライドできるようにObjectInputSteamクラスに拡張します。
上記のコードでは、次の行があります。
if (!desc.getName().equals(Employee.class.getName())) {
シリアライズされたコンテンツにEmployeeクラスのオブジェクトが含まれている場合、基本的にはエラー”Unauthorized deserialization attempt”を提供し、その実行を妨げます。,
これで、”DeserializedDemo”の最終的な変更コードは次のとおりです。