学习札记-断言漏洞

admin 2023年3月29日00:06:53评论24 views字数 2305阅读7分41秒阅读模式


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

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、对用户数据执行输入验证

原文始发于微信公众号(Th0r安全):学习札记-断言漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月29日00:06:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   学习札记-断言漏洞https://cn-sec.com/archives/1634756.html

发表评论

匿名网友 填写信息