まず、セキュリティの脅威を判断するためにコンテキストを理解する必要があります。(「信頼」について話すとき、私は少し近道をしています。意図的に悪意を持って話しているのです。)
シリアル化されたデータが同じ信頼で作成、保持、および読み取られた場合、実際の問題はありません (標準的なバグ以外)。機密情報を書き込む場合、シリアル化されたデータも機密であることに注意してください (明らかなように見えますが、そこにはかなりの量の間接性があります)。
シリアル化されたデータが何らかの理由で信頼できない場合は、もう少し検討する必要があります。再作成されたオブジェクトの内部構造は「異常」である可能性があります。データに一貫性がない可能性があります。別々にする必要がある変更可能なオブジェクトを共有している可能性があります。デシリアライゼーションは、無限ループ、または宇宙の熱死の前にたまたま完了できない非無限ループを引き起こす可能性があります。そしてもちろん、データは嘘かもしれません。
信頼性の低いコードで使用されるライブラリ コードを作成している場合は、さらに興味深い結果が得られます。
「カレンダー バグ」(および類似のバグ) の場合は、悪意のあるデータと悪意のあるコードを含む任意のストリームを逆シリアル化することです。Java セキュア コーディング ガイドラインでは、カスタム メソッド内で (「Java2 セキュリティ モデル」を使用して) セキュリティ チェックを行うことを提案していreadObject
ます。これは、コードとデータが持つ以上の信頼でデシリアライゼーションを呼び出すべきではないことを意味します。
デシリアライズ可能なオブジェクトの側から見ると、事態はより複雑になります。、、、またはデフォルトのデシリアライゼーションObjectInputStream
によって提供されるオブジェクトは、悪意のあるコードによってキャプチャされた参照を持つか、非最終クラスの場合、悪意を持ってサブクラス化される可能性があります。オブジェクトは、部分的に初期化されている場合、逆シリアル化中にも使用できます。逆シリアル化は、逆シリアル化されたクラスの「実際の」コンストラクターを呼び出しません ( /は一種の疑似コンストラクターであり、s を設定することはできません)。それは悪夢のようなものなので、機密性の高いクラスをシリアライズ可能にしたくないでしょう。readObject
readUnshared
defaultReadObject
readFields
readObject
readObjectNoData
final
シリアライゼーションとデシリアライゼーションの実装には、多くの脆弱性が存在します。自分で実装しない限り、これについて心配する必要はありません。