RASP自身安全性
一、关键方法加固
利用方式1: 反射调用全局关闭方法
尝试在业务类中反射调用RASP关闭的方法,该方式简单粗暴,利用频率较高,反射操作代码如下:
java
Class<?> bridgeClass=Class.forName("com.jrasp.agent.bridge120.Bridge",false,null);
// 调用清除全局处理器的clean方法
Method cleanMethod=bridgeClass.getMethod("clean");
cleanMethod.setAccessible(true);
cleanMethod.invoke(null);
反射调用抛出异常 java.lang.SecurityException: this method is not allowed to invoke.
,调用失败,阻止RASP功能被关闭;
利用方式2: 反射关闭全局检测开关
反射关闭RASP检测开关:
java
Class<?> securityStateKeeper=Class.forName("com.jrasp.agent.bridge120.SecurityStateKeeper",false,null);
// 反射关闭全局检测开关
Field checkDisableField=securityStateKeeper.getDeclaredField("checkDisable");
checkDisableField.setAccessible(true);
checkDisableField.set(null,true);
调用报错:java.lang.NoSuchFieldException: checkDisable
利用方式3: 直接调用关闭的方法(反射的绕过)
step1: 在业务工程中引入jrasp-bridge依赖(scope=provided):
java
<dependency>
<groupId>com.jrasp</groupId>
<artifactId>jrasp-bridge</artifactId>
<version>1.2.5</version>
<scope>provided</scope>
</dependency>
step2: 直接调用静态方法:
java
com.jrasp.agent.bridge120.SecurityStateKeeper.setCheckDisable(true);
抛出异常java.lang.SecurityException: this method is not allowed to invoke.
利用方式3: 反射RASP其他方法
新增反射模块,禁用com.jrasp.
等包下类的反射操作
二、代码防止篡改
利用方式:类的转换与重新定义
防护方式1: 监控hook类的转换与重新定义
java
2024-10-19 23:16:08.900 [WARN] [jrasp-agent] 85376 --- [catalina-exec-99] transform class more than once, class: java/lang/ClassLoader, loader: null
防护方式2: agent加载白名单
白名单在管理端配置
防护方式3: 禁止rasp类重新转换与定义
三、方法调用者hash校验
四、检测算法黑白名单hash
- 安全风险:虽然磁盘上是加密,如果在运行时dump类,还是比较容易绕过
反序列化插件源码中的黑名单字段如下:
当设置@RaspValue
注解的属性hash = true
时,jrasp编译插件将字符串转为MD5值,转换过程对用户透明,用户无需关注;配置更新时自动转换为hash值;
运行时JDK反序列化黑名单列表:
五、配置和jar包磁盘加密
- 模块jar包磁盘加密
- 安装目录下的config/config.json文件,默认加密,如果需要明文存储在本地,需要在管理端开启对应配置;
- 密钥在daemon编译时写入;如果需要更新密钥,请重新编译新的daemon然后替换整个二进制文件;
六、关键方法下沉到JNI
- 加解密算法、hash计算算法
七、通信过程加密
鉴于ebpf技术已经破解了ssl协议的解密逻辑,即无需证书可截获https通信内容,为保障日志/配置传输安全性,对http/socket body进行加密。
- daemon与agent通信加密与验签
- daemon与server通信加密与验签
八、核心代码混淆
九、安装jrasp的主机必须授权
- 机器码与主机绑定,防止将jrasp复制到非授权环境强行破解