SV.SERIAL.NOFINAL

シリアル化可能なクラスでは、メソッド readObject() および writeObject() は final である必要があります

クラスが 'java.io.Serializable' インターフェイスを直接的または間接的に実装していながらも、宣言された 'readObject' メソッドまたは 'writeObject' メソッドが final として宣言されていない場合に、そのクラスに関する SV.SERIAL.NOFINAL の問題が報告されます。

脆弱性とリスク

クラスが 'readObject' メソッドおよび 'writeObject' メソッドを final として宣言していない場合、攻撃者は、変更しても安全であると見なされたオブジェクトまたはデータを変更できます。

脆弱コード例 1

コピー
  class SV_SERIAL_NOFINAL_Sample implements Serializable 
  {
      private void readObject(ObjectInputStream aInputStream) throws ClassNotFoundException, IOException
      {
          ...
      }
 }

Klocwork は 3 行目で SV.SERIAL.NOFINAL の欠陥を報告して次を示します。「private void readObject(ObjectInputStream aInputStream): クラス 'SV_SERIAL_NOFINAL_Sample' は 'java.io.serializable' を実装していますが、メソッド 'readObject' は final ではありません。」

修正コード例 1

コピー
  class SV_SERIAL_NOFINAL_Sample implements Serializable 
  {
      private final void readObject(ObjectInputStream aInputStream) throws ClassNotFoundException, IOException
      {
         ...
      }
 }

この例では、メソッド 'readObject' は final として宣言されているため、Klocwork は 3 行目で SV.SERIAL.NOFINAL の欠陥を報告しなくなりました。

脆弱コード例 2

コピー
  class SV_SERIAL_NOFINAL_Sample_1 implements Serializable 
  {     
      private void writeObject(ObjectInputStream aInputStream) throws IOException
      {
          ...
     }
 }

この例では、Klocwork は 3 行目で SV.SERIAL.NOFINAL の欠陥を報告し、次を示します。「private void writeObject(ObjectInputStream aInputStream): クラス 'SV_SERIAL_NOFINAL_Sample' は 'java.io.serializable' を実装していますが、メソッド 'writeObject' は final ではありません。」

修正コード例 2

コピー
  class SV_SERIAL_NOFINAL_Sample_1 implements Serializable 
  {     
      private final void writeObject(ObjectInputStream aInputStream) throws IOException
     {
          ...
     }
 }

メソッド 'readObject' は final として宣言されているため、Klocwork は 3 行目で SV.SERIAL.NOFINAL の欠陥を報告しなくなりました。

関連チェッカー