Reino: Code Quality

Una mala calidad del código lleva a un comportamiento no predecible. Desde la perspectiva de un usuario, muchas veces también supone una usabilidad limitada. Pero para un atacante es una oportunidad para atacar al sistema de formas insospechadas.

Code Correctness: readObject() Invokes Overridable Function

Abstract
El método readObject() de la clase llama a una función que puede anularse.
Explanation
Durante la deserialización, readObject() actúa como un constructor, por lo que la inicialización del objeto no se completa hasta que finaliza esta función. Así, cuando una función readObject() de una clase Serializable llama a una función que se puede sobrescribir, puede permitir que el método de sobrescritura acceda al estado del objeto antes de que se inicialice por completo.

Ejemplo 1: la siguiente función readObject() llama a un método que se puede sobrescribir.


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

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


Como la función checkStream() y su clase envolvente no son final y públicas, la función se puede sobrescribir y un atacante puede sobrescribir la función checkStream() para tener acceso al objeto durante la deserialización.
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