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 已声明为最终方法。