界: Code Quality
コードの質が低いと、予測できない動作につながります。ユーザーの視点には、それがしばしば使い勝手の悪さとなって現れます。攻撃者にとっては、予期せぬ方法でシステムにストレスを与える機会となります。
Code Correctness: readObject() Invokes Overridable Function
Abstract
クラス内の
readObject()
メソッドは、オーバーライドされる可能性のある関数を呼び出します。Explanation
デシリアライゼーションの間、
例 1: 次の
関数
readObject()
は、コンストラクターのように振る舞うため、オブジェクトの初期化は関数が終わるまで完了しません。そのため、Serializable
の readObject()
関数がオーバーライド関数をコールすると、完全に初期化される前にオブジェクトの状態にオーバーライド メソッドがアクセスできるようになります。例 1: 次の
readObject()
関数は、オーバーライドされる可能性のあるメソッドをコールしています。
...
private void readObject(final ObjectInputStream ois) throws IOException, ClassNotFoundException {
checkStream(ois);
ois.defaultReadObject();
}
public void checkStream(ObjectInputStream stream){
...
}
関数
checkStream()
と括弧で囲まれたクラスは final
ではなくパブリックであるため、関数がオーバーライドできるようになります。つまり、攻撃者は checkStream()
関数をオーバーライドし、デシリアライゼーションの間、オブジェクトにアクセスできるようになります。References
desc.structural.java.code_correctness_readobject_invokes_overridable_function