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 の欠陥を報告しなくなりました。

関連チェッカー