SV.SERIAL.NOFINAL

serializable 类中的方法 readObject() 和 writeObject() 应为最终方法

如果一个类直接或间接地实施 java.io.Serializable 接口,但声明的方法 readObject 或 writeObject 却不是最终声明的方法,则会针对此类报告 SV.SERIAL.NOFINAL。

漏洞与风险

如果一个类未声明 readObject 和 writeObject 为最终方法,则攻击者能够修改假定为可安全进行修改的对象或数据。

漏洞代码示例 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): Class 'SV_SERIAL_NOFINAL_Sample' 实施 java.io.serializable,但方法 readObject 不是最终方法。”

修正代码示例 1

复制
  class SV_SERIAL_NOFINAL_Sample implements Serializable 
  {
      private final void readObject(ObjectInputStream aInputStream) throws ClassNotFoundException, IOException
      {
         ...
      }
 }

在此示例中,Klocwork 在第 3 行不再报告 SV.SERIAL.NOFINAL 缺陷,因为方法 readObject 已声明为最终方法。

漏洞代码示例 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): Class 'SV_SERIAL_NOFINAL_Sample' 实施 java.io.serializable,但方法 writeObject 不是最终方法。”

修正代码示例 2

复制
  class SV_SERIAL_NOFINAL_Sample_1 implements Serializable 
  {     
      private final void writeObject(ObjectInputStream aInputStream) throws IOException
     {
          ...
     }
 }

Klocwork 在第 3 行不再报告 SV.SERIAL.NOFINAL 缺陷,因为方法 readObject 已声明为最终方法。

相关检查器

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。