CWE-617: 可达的assertion漏洞会造成哪些后果?

本文主要为了助力企业有效防范软件安全漏洞,提升网络安全防护能力,本期主题为第五十期:可达的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;

}

}

使用Wukong代码安全检测工具检测上述程序代码,则可以发现代码中存在着“可达的assertion”的安全漏洞。请见下图:

在(case1_bad.java)文件第(12、13、16)行使用断言验证方法参数,当断言被禁用时,验证代码不会执行,参数检查通常是方法的一部分,无论断言是启用还是禁用,都必须维护此合约。

可达的assertion在CWE中被编号为CWE-617: Reachable Assertion

posted @ 2021-07-02 10:40  中科天齐软件原生安全  阅读(195)  评论(0编辑  收藏  举报