本文主要为了助力企业有效防范软件安全漏洞,提升网络安全防护能力,本期主题为第五十期:可达的assertion的相关介绍。
01 什么是可达的assertion?
程序包含一个可以被攻击者触发的assert()或类似语句,这将导致应用程序退出或其他不必要的严重行为。
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion可作为程序中的一条语句,对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。
一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启,为了提高性能,在软件发布后,assertion检查通常是关闭的。在语法上,为了支持assertion,Java增加了一个关键字assert。
02 可达的assertion漏洞的构成条件有哪些?
当断言用于公共方法中的参数检查时,就可能会出现“可达的assertion”安全漏洞。
03 可达的assertion漏洞会造成哪些后果?
当断言禁用时,参数的验证将失效,可能导致非预期的结果。
虽然断言有助于捕获逻辑错误并减少出现更严重的漏洞的机会,但它仍然可能导致拒绝服务。例如,如果一个服务器处理多个并发连接,并且在一个连接中出现assert(),导致所有其他连接被丢弃,这是一个可到达的断言,将导致拒绝服务。
04 可达的assertion漏洞的防范和修补方法有哪些?
断言不应该用于公共方法中的参数检查。参数检查通常是方法的一部分,无论断言是启用还是禁用,都必须遵守此规则。
05 可达的assertion漏洞样例
public class case1_bad {
public static void main(String[] args) {
System.out.println(fun());
boolean flag=1>2;
assert true;
}
public static int getAbsAdd(int x, int y) {
assert x != Integer.MIN_VALUE;
assert y != Integer.MAX_VALUE;
nt absX = Math.abs(x);
int absY = Math.abs(y);
assert (absX <= Integer.MAX_VALUE - absY);
return absX + absY;
}
public static int fun() {
boolean flag = 3 > 2;
assert flag;
return 1;
}
}
使用悟空代码安全检测工具检测上述程序代码,则可以发现代码中存在着“可达的assertion”的安全漏洞。
在(case1_bad.java)文件第(12、13、16)行使用断言验证方法参数,当断言被禁用时,验证代码不会执行,参数检查通常是方法的一部分,无论断言是启用还是禁用,都必须维护此合约。
可达的assertion在CWE中被编号为CWE-617: Reachable Assertion