By. Whoopsunix
发现 jvm-sandbox 从 1.4.0 开始实现了 Native 的增强,正好P写一个简单的 RASP Demo 来熟悉这个 AOP 框架(其实是懒得用 ASM)
RASP 真的很适合用来学 Java,复现分析+防护的漏洞学习模式会加深漏洞的理解能力
why jvm-sandbox?
- AOP 框架、沙箱类隔离等架构优点,很难拒绝
- 基层基于 ASM 实现,框架比较熟悉,后续有更复杂的需求时可以改源码方便
- 虽然没有一个很详细的文档,不过好在源代码注释非常多,并且给出了 Module 编写例子,在 sandbox-debug-module 中提供了很多工具类代码
🚩 同步 JavaRce 项目实现基础漏洞的 HOOK,同步 PPPVULNS 项目实现部分 CVE 触发的识别
⭐️ 只会拦截来自 http 请求的 HOOK 点触发,可以使用项目配套测试环境进行测试 vulEnv,配套 postman api 文件
- 打包 ppprasp-agent
pom.xml 报错是正常的,不影响打包
mvn clean package -Dmaven.test.skip=true -Dmaven.javadoc.skip=true
- 下载 jvm-sandbox 二进制包
- 将打包好的项目移动到 sandbox/sandbox-module 文件夹下
- 启动
-javaagent
-javaagent:sandbox/lib/sandbox-agent.jar
或者 attach
# 进入沙箱执行脚本
cd sandbox/bin
# 挂载 目标JVM进程33342
./sandbox.sh -p 33342
# 卸载
./sandbox.sh -p 33342 -S
-d 可以向 Module 发送命令,eg. -d 'sandbox-info/version'
-P 开启 Jetty 接口,./sandbox.sh -p 80258 -P 1234
接口开启后可以通过 http 发送 -d 中的命令,eg. /sandbox/default/module/http/sandbox-info/version
这部分内容没有文档可以参考 sandbox-mgr-module 来自行构建
通过 rasp.yml 配置文件来开启漏洞检测
- 黑名单拦截,写了个
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
意思意思
SPEL、OGNL
- 黑名单拦截
- hook 来自外部输入的
javax.naming.Context.lookup()
调用
- hook 来自外部输入的
java.lang.ClassLoader.loadLibrary0()
调用
- 参考 jrasp 实现了线程注入的拦截
- Jvm-sandbox 1.4.0 实现了 native 方法的 hook ,因此支持拦截
forkAndExec()
-
com.mysql.cj.jdbc.StatementImpl
类下 sql 执行语句全拦截,没加语义词义分析
CVE 漏洞分成两类
- 一类是在基础漏洞上的触发比如 SPEL ,不需要额外 HOOK,调用栈遍历时添加一个类匹配就能检查是否由 CVE 触发,所以分析过的漏洞就顺便加上了
- 另一类就是框架本身的问题,这部分需要额外工作量暂时就不考虑引入了
反序列化漏洞需要准确识别到调用了相关黑名单函数才会拦截,目前没有针对此补全,所以实际 CVE 检测时可能上报其他漏洞检测类型。
基本漏洞类型 | 组件 | CVE |
---|---|---|
SPEL | Spring-messaging | CVE-2018-1270, CVE-2018-1275 |
Deserialization | Apache Dubbo | CVE-2019-17564 |
Deserialization | Apache Dubbo | CVE-2020-1948 |