SV.SERIAL.OVERRIDE
readObject() メソッドからオーバーライド可能なメソッドを呼び出さないでください
クラスが java.io.Serializable インターフェイスを直接的または間接的に実装していながらも、宣言されたメソッド 'readObject' がオーバーライド可能なメソッドを呼び出している場合に、Klocwork はそのクラスに関する SV.SERIAL.OVERRIDE の指摘を報告します。
脆弱性とリスク
readObject() メソッドは、オーバーライド可能なメソッドを呼び出してはなりません。readObject() メソッドからオーバーライド可能なメソッドを呼び出すと、オーバーライドするメソッドが、オブジェクトが完全に初期化される前に、オブジェクトの状態にアクセスできるようになります。シリアル化解除では、readObject メソッドがオブジェクトコンストラクターの役割を果たしており、readObject が終了するまでオブジェクトの初期化が完了しないため、こうした早過ぎるアクセスが可能になります。
脆弱コード例 1
class SV_SERIAL_OVERRIDE implements Serializable {
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
stream.readObject();
publicMethod();
protectedMethod();
}
public void publicMethod() {
}
protected void protectedMethod() {
}
}
この例では、Klocwork は 4 行目で SV.SERIAL.OVERRIDE の欠陥を報告して「readObject() メソッドから呼び出されたオーバーライド可能なメソッド 'publicMethod()'」を表示し、5 行目で SV.SERIAL.OVERRIDE の欠陥を報告して「readObject() メソッドから呼び出されたオーバーライド可能なメソッド 'protectedMethod()'」を表示します。
修正コード例 1
class SV_SERIAL_OVERRIDE implements Serializable {
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
stream.readObject();
publicMethod();
protectedMethod();
}
private void publicMethod() {
}
private void protectedMethod() {
}
}
この例では、publicMethod() と privateMethod() が 'private' として宣言されており、オーバーライドできないため、Klocwork は 4 行目または 5 行目で SV.SERIAL.OVERRIDE の欠陥を報告しなくなりました。
脆弱コード例 2
class SV_SERIAL_OVERRIDE implements Serializable {
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
stream.readObject();
method1();
method2();
}
void method1() {
}
void method2() {
}
}
この例では、Klocwork は 4 行目で SV.SERIAL.OVERRIDE の欠陥を報告して「readObject() メソッドから呼び出されたオーバーライド可能なメソッド 'method1()'」を表示し、5 行目で SV.SERIAL.OVERRIDE の欠陥を報告して「readObject() メソッドから呼び出されたオーバーライド可能なメソッド 'method2()'」を表示します。
修正コード例 2
class SV_SERIAL_OVERRIDE implements Serializable {
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
stream.readObject();
method1();
method2();
}
final void method1() {
}
final void method2() {
}
}
この例では、method1() と method2() が 'final' として宣言されており、オーバーライドできないため、Klocwork は 4 行目または 5 行目で SV.SERIAL.OVERRIDE の欠陥を報告しなくなりました。
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。