界: Code Quality
代码质量不佳会导致不可预测的行为。对于用户来说,通常表现为可用性差。对于攻击者来说,提供了以意外方式对系统施加压力的机会。
Code Correctness: Constructor Invokes Overridable Function
Abstract
类的构造函数会调用可以被覆盖的函数。
Explanation
如果构造函数调用了可覆盖的函数,则在该对象完全初始化之前,攻击者将可以访问
示例 1:以下示例调用了可覆盖的方法。
由于函数
this
引用,进而导致出现漏洞。示例 1:以下示例调用了可覆盖的方法。
...
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;
}
}
由于函数
validateUser
和该类并非 final
,这意味着它们是可以被覆盖的,对将覆盖此该函数的子类的变量执行初始化会允许避开 validateUser
功能。例如:
...
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");
}
}
}
Example 1
中的代码会输出“Attack successful!”,因为 Attacker
类会覆盖从超类 User
的构造函数调用的 validateUser()
函数,并且 Java 将首先在子类中查找从该构造函数调用的函数。References
desc.structural.java.code_correctness_constructor_invokes_overridable_function