私はjava Serialオブジェクトを読み込んだJavaプログラムを受け取っていれば、プログラムはいくつかのビジネスロジックを実行します。私はJavaプログラムのソースコードを持っていないと仮定し、シリアルオブジェクトの実装方法に関するドキュメントもありません。これは、プログラムを実行させることができるfake
クライアントを作ることが可能ですか?他の人がsrc内に `偽の` Javaオブジェクトを実装することは可能ですか?
ありがとうございました。
私はjava Serialオブジェクトを読み込んだJavaプログラムを受け取っていれば、プログラムはいくつかのビジネスロジックを実行します。私はJavaプログラムのソースコードを持っていないと仮定し、シリアルオブジェクトの実装方法に関するドキュメントもありません。これは、プログラムを実行させることができるfake
クライアントを作ることが可能ですか?他の人がsrc内に `偽の` Javaオブジェクトを実装することは可能ですか?
ありがとうございました。
Javaシリアル化を想定します。
理論的には、シリアルストリームを見て、どのクラスとフィールドが期待されているかを確認する必要があります。ちょうど時間内にクラスを構築することができます(ストリームを解析するためにObjectInputStream
を使用する場合、毎回ストリームの読み込みを再開する必要があります)。カスタムwriteObject
の方法でdefaultWriteObject
/putFields
の後に書き込まれたデータは、確実に解釈できません。
実際には、人々(Javaライブラリの作者を含む)はちょっとおかしなことがあり、defaultWriteObject
/putFields
を見逃すことがあります。つまり、ストリームは実際には正しい形式ではありません。下位互換性のために修正するのはおそらく少し遅れたでしょう。
偽のクライアントは期待されるクラスの名前を知る必要があります。見つからない場合、例外メッセージから発見できます。そのserialVersionUIDの同上;そのシリアル化可能なフィールドは、ではなく、発見可能です。理論的には、シリアライズされたストリームからそれを発見することは可能ですが、任意のクラスが独自のwriteObject()メソッドまたはwriteExternalizable()メソッドを持つことができれば、任意の複雑な任意のクラスを素早く得ることができます。
私はカジュアルなリスクとしてこれ以上の睡眠を失うことはありません。
また、JARに署名して該当するパッケージを封印することもできます。これにより、特定のリスクが排除されます。
OTOHアプリケーションのセキュリティのために本物のニードを持っている場合は、間違った場所を探しています。
私はあなたの考えに完全に従っていません。
オブジェクトを逆シリアル化することで、アプリケーションに新しいコードを挿入することはできません。オブジェクトがプログラムによって/によって直列化に成功するためには、そのプログラムはクラスパス上のオブジェクトのクラスを持っていなければなりません。そうでない場合、逆シリアル化は失敗します。
一方、プログラムが特定のセキュリティ上の欠陥を持つ特定のクラスを既に使用していたことを何らかの形で知っていて、そのクラスのインスタンスを逆シリアル化してその欠陥が悪用される可能性がある場合、懸念があります。 (私はすべての詳細を思い出すことができないけれども私は漠然と、このアプローチは、特定の脆弱性のクラスで使用されてきたことを思い出してください。)
一番下の行は、セキュリティを意識したアプリケーションは、その可能性のあるオブジェクトをデシリアライズしようとしないということです信頼できない情報源から来たものであるか、または通過中に変更された可能性があります。
EasyMockやMockitoなどの模擬フレームワークを使用してください – krock