【学习笔记】CWE-617: 可达的assertion断言安全漏洞

断言语句在Java中用于测试假设条件,确保程序的正确性。它们在不应执行的代码路径下抛出AssertionError。断言可用于控制流检查、方法参数验证、返回值检查和程序不变量的维护。然而,公共方法的参数检查不应依赖断言,因为这可能导致可达的assertion漏洞,允许攻击者触发异常或拒绝服务。安全建议包括对用户输入进行验证,并谨慎使用断言。开启和关闭断言检查可以通过命令行选项-ea和-da进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

断言语句

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语句

public class AssertionDemo{
    public static void main (String[] args){
        int color=7;
        switch (color){
            case1:System.out.println("red");break;
            case2:System.out.println("orange");break;
            case3:System.out.println("yellow");break;
            case4:System.out.println("green");break;
            case5:System.out.println("cyan");break;
            case6:System.out.println("blue");break;
            case7:System.out.println("purple");break;
            default:assert false:"This is not the color of a rainbow“;break;
            }
    }
}

2、检查私有方法输入参数的有效性

在私有方法调用时会使用直接传入的参数,如果私有方法对参数有特定的要求可以在方法处使用断言进行参数检查

Assert parameter1  != null :"parameter is null in test()"

3、检查方法的返回结果是否有效

可以在方法返回前加入断言语句检查返回值是否满足必要的性质

Assert value >=0 : "Value should be bigger than 0: "+ value;

4、检查程序不变量

不变量反应程序的特性,可以通过分析程序的不变量监测程序运行中的异常

if(x>0){
...
}else{
assert (x == 0);
...
}

断言漏洞

由于public方法在调用时系统必须进行参数检查而私有方法是直接使用的,因此不要使用断言进行public方法的参数有效性检查以及执行程序需要完成的正常操作,当断言用于公共方法中的参数检查时,就可能会出现“可达的assertion”安全漏洞。

例1:

String email = request.getParameter("email_address");
assert email != null;  
如果用户没有在表单中输入邮件地址,就会抛出AssertionError(未检查的异常)

例2:OpenLDAP  CVE-2020-25709

例3:

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;
}
}

控制断言的命令

打开断言检查

java - enableassertions MyProgram
java - ea MyProgram

关闭断言检查

java - disableassertions MyProgram
java - da MyProgram

漏洞危害

在处理恶意数据包时,受影响的产品服务器中的缺陷可能会导致断言失败,这可能会导致拒绝服务的情况。

安全建议

1、使敏感的打开/关闭操作无法通过直接由用户控制的数据(例如打开/关闭资源)访问

2、对用户数据执行输入验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值