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