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: Constructor Invokes Overridable Function
Abstract
Un constructor de la clase llama a una función que puede anularse.
Explanation
Cuando el constructor llama a una función que se puede sobrescribir, el usuario malintencionado puede tener acceso a la referencia de
Ejemplo 1: el siguiente ejemplo llama a un método que se puede sobrescribir.
Como la función
El código en el
this
antes de que el objeto se inicialice por completo, lo que a su vez puede suponer vulnerabilidad.Ejemplo 1: el siguiente ejemplo llama a un método que se puede sobrescribir.
...
class User {
private String username;
private boolean valid;
public User(String username, String password){
this.username = username;
this.valid = validateUser(username, password);
}
public boolean validateUser(String username, String password){
//validate user is real and can authenticate
...
}
public final boolean isValid(){
return valid;
}
}
Como la función
validateUser
y la clase no son final
, significa que se pueden sobrescribir y, en consecuencia, al inicializar una variable en la subclase que sobrescribe dicha función, será posible eludir la funcionalidad validateUser
. Por ejemplo:
...
class Attacker extends User{
public Attacker(String username, String password){
super(username, password);
}
public boolean validateUser(String username, String password){
return true;
}
}
...
class MainClass{
public static void main(String[] args){
User hacker = new Attacker("Evil", "Hacker");
if (hacker.isValid()){
System.out.println("Attack successful!");
}else{
System.out.println("Attack failed");
}
}
}
El código en el
Example 1
imprime "¡Ataque satisfactorio!" porque la clase Attacker
sobrescribe la función validateUser()
, llamada desde el constructor de la superclase User
, y Java comprobará primero la subclase en busca de funciones llamadas desde el constructor.References
desc.structural.java.code_correctness_constructor_invokes_overridable_function