CWE-617: 可达的assertion断言安全漏洞
断言语句
assert expression;
expression是boolean类型的表达式,当系统运行该断言语句时会求出该表达式的值
false->程序处于不正确的状态,系统将会报错AssertionError并退出
ture->程序继续执行
assert expression1:expression2;
expression2可以是boolean,clear,double,float,int和long基本类型的值或者是一个object类型的对象。
当expression1的值为false,系统将会计算出expression2的值并用该值为参数调用AssertionError方法,创建一个包含详细描述信息的对象抛出并退出
当expression1的值为ture,expression2的值将不会被计算,程序也将继续执行。
断言作用
1、保证控制流的正确性
在if else和switch语句中,可以在不应该被执行的控制流下使用assert false语句
2、检查私有方法输入参数的有效性
在私有方法调用时会使用直接传入的参数,如果私有方法对参数有特定的要求可以在方法处使用断言进行参数检查
3、检查方法的返回结果是否有效
可以在方法返回前加入断言语句检查返回值是否满足必要的性质
4、检查程序不变量
不变量反应程序的特性,可以通过分析程序的不变量监测程序运行中的异常
断言漏洞
由于public方法在调用时系统必须进行参数检查而私有方法是直接使用的,因此不要使用断言进行public方法的参数有效性检查以及执行程序需要完成的正常操作,当断言用于公共方法中的参数检查时,就可能会出现“可达的assertion”安全漏洞。
例1:
例2:OpenLDAP CVE-2020-25709例3:
控制断言的命令
打开断言检查
关闭断言检查
漏洞危害
在处理恶意数据包时,受影响的产品服务器中的缺陷可能会导致断言失败,这可能会导致拒绝服务的情况。
安全建议
1、使敏感的打开/关闭操作无法通过直接由用户控制的数据(例如打开/关闭资源)访问2、对用户数据执行输入验证
领取专属 10元无门槛券
私享最新 技术干货