界: Code Quality

程式碼品質不佳,會導致無法預料的行為。從使用者的角度來看,這通常表現為可用性不佳。對於攻擊者而言,這提供了以意想不到的方式向系統施加壓力的機會。

Code Correctness: readObject() Invokes Overridable Function

Abstract
類別中的 readObject() 方法所呼叫的函數可能被取代。
Explanation
在還原序列化期間,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
[1] SER09-J. Do not invoke overridable methods from the readObject() method CERT
[2] EXTEND-5: Limit the extensibility of classes and methods Oracle
[3] SERIAL-3: View deserialization the same as object construction Oracle
desc.structural.java.code_correctness_readobject_invokes_overridable_function