# 常见问题
# 1.支持容器环境的动态注入吗?
jrasp运行在容器内,可以;在宿主机上,不支持容器内进程注入;
# 2.支持对同一节点上的多个进程注入吗?
支持,注入进程数量无限制。
# 3.异步线程调用问题如何解决?
目前【暂不解决】,强制关联线程有性能损耗。异步线程会丢失http/rpc报文消息,对检测算法的准确性、攻击溯源【有一定】的影响。
- 对于线程注入场景已经解决。详情:CHANGELOG v1.1.0
# 4. attach之后对原进程性能有多大的影响?
jrasp在执行插桩时,本质上是在method的前后插入代码,会导致原来JVM里JIT编译生成的代码无效,需要退回原来的代码,再重新JIT编译 (JIT Depotimization)。 所以对于并发高的函数调用会调起抖动。 因此要避免一次性修改大量的类,对于已经修改的类不要做字节码回滚的操作,并且字节码的变更尽量在服务的低峰期进行; 建议在生产环境部署时,在服务的低峰期进行,有条件的可以切除流量。
值得注意的是:jrasp很早就观察到这种现象,并且在这方面做了一定的优化。
一方面:将检测模块拆分为hook模块+检测模块,hook模块只负责插桩并调用算法模块,这部分不需要反复变更(意味着不需要进行字节码修改),仅需要更改算法模块(无字节码修改,无性能损耗); 另一方面:hook模块按照功能划分,每个模块实现单独的加载和卸载,实现了增量式变更,将字节码修改的影响降到最低;
参考 VM_RedefineClasses::flush_dependent_code (opens new window)
// Deoptimize all compiled code that depends on this class.
//
// If the can_redefine_classes capability is obtained in the onload
// phase then the compiler has recorded all dependencies from startup.
// In that case we need only deoptimize and throw away all compiled code
// that depends on the class.
//
// If can_redefine_classes is obtained sometime after the onload
// phase then the dependency information may be incomplete. In that case
// the first call to RedefineClasses causes all compiled code to be
// thrown away. As can_redefine_classes has been obtained then
// all future compilations will record dependencies so second and
// subsequent calls to RedefineClasses need only throw away code
// that depends on the class.
2
3
4
5
6
7
8
9
10
11
12
13
14
关于JIT的参考:
hotspot-jit (opens new window)
OpenJDK-HotSpot-What-the-JIT (opens new window)
# 5. jrasp目前有多少使用量?
截止到2022年6月,已经接入的主机数量超过1000+,防护的Java进程数量5000+;
# 6.rasp如何与其他agent兼容
一般公司内部会有各种java agent,如何保证jrasp与其他agent的兼容性,主要从这3个方面:
1.代码隔离: jrasp采用自定义类加载器,与业务的隔离级别是类加载器级别的隔离,用户、其他agent无法访问rasp类,rasp无法访问用户类(仅在进入业务方法时可以访问);
而常见的rasp为了能够实现修改jdk类、业务类,将rasp代码使用 bootclassloader 加载,全部可见。
2.字节码层面的兼容;基于方法的进入、返回、抛出异常修改方法体,不增加字段和方法,如果同一个方法被其他agent修改后,rasp在修改后的方法基础上更改;
3.打包方式:依赖的三方包,使用shade模式更改包名称,如agent都依赖的asm工具包等,解决依赖冲突问题
- 其他agent应该排除观测rasp的类,即不转换rasp类
# 7.支持的web/jdk
- 支持jdk6~11 (jdk12~19进行中)
- web容器:tomcat6~10、jetty8~11、springboot1.x~2.x、undertow、weblogic
# 8.安全模块
截止到2023-01-06,已经具备十多种安全模块,覆盖常见漏洞。
# 9.接入方式
接入方式有2种:
静态接入
(修改jvm启动参数)动态接入
(用户无需修改任何代码/参数)
# 10.多语言支持
目前仅支持Java
(JRASP), 未来考虑支持Golang (GoRASP)其他语言暂不支持