Reino: Code Quality

Códigos de baixa qualidade levam a comportamentos imprevisíveis. Da perspectiva do usuário, isso normalmente se manifesta como usabilidade ruim. Para um invasor, trata-se de uma oportunidade para atacar o sistema de formas imprevistas.

Code Correctness: readObject() Invokes Overridable Function

Abstract
O método readObject() na classe chama uma função que pode ser substituída.
Explanation
Durante a desserialização, readObject() age como um construtor e, portanto, a inicialização do objeto só estará concluída quando essa função terminar. Portanto, quando uma função readObject() de uma classe Serializable chama uma função substituível, isso pode fornecer ao método de substituição o acesso necessário ao estado do objeto antes que ele seja totalmente inicializado.

Exemplo 1: A função readObject() a seguir chama um método que pode ser substituído.


...
private void readObject(final ObjectInputStream ois) throws IOException, ClassNotFoundException {
checkStream(ois);
ois.defaultReadObject();
}

public void checkStream(ObjectInputStream stream){
...
}


Como a função checkStream() e sua classe delimitadora não são final e públicas, isso implica que a função pode ser substituída, o que pode significar que um invasor pode substituir a função checkStream() a fim de obter acesso ao objeto durante a desserialização.
References
[1] SER09-J. Do not invoke overridable methods from the readObject() method CERT
[2] EXTEND-5: Limit the extensibility of classes and methods Oracle
[3] SERIAL-3: View deserialization the same as object construction Oracle
desc.structural.java.code_correctness_readobject_invokes_overridable_function