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: Constructor Invokes Overridable Function
Abstract
Um construtor da classe chama uma função que pode ser substituída.
Explanation
Quando um construtor chama uma função substituível, isso pode permitir que um invasor acesse a referência
Exemplo 1: O exemplo a seguir chama um método que pode ser substituído.
Como a função
O código no
this
antes que o objeto seja totalmente inicializado, o que, por sua vez, pode provocar uma vulnerabilidade.Exemplo 1: O exemplo a seguir chama um método que pode ser substituído.
...
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 a função
validateUser
e a classe não são final
, isso significa que elas podem ser substituídas e, dessa forma, inicializar uma variável para a subclasse que substitui essa função possibilitaria o desvio da funcionalidade validateUser
. Por exemplo:
...
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");
}
}
}
O código no
Example 1
imprime "Attack successful!", uma vez que a classe Attacker
substitui a função validateUser()
que é chamada a partir do construtor da superclasse User
, e o Java primeiro examinará a subclasse em busca de funções chamadas a partir desse construtor.References
desc.structural.java.code_correctness_constructor_invokes_overridable_function