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 の欠陥を報告しなくなりました。
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。