通过 JNDI Reference
加载的 RMI 类,不一定需要实现 java.rmi.Remote
接口或者继承 UnicastRemoteObject
。这个要求取决于你使用的具体对象类型和你的目标。
下面是更详细的解释:
1、RMI 远程对象的要求
RMI 远程对象本身是要实现 java.rmi.Remote
接口,并通常需要继承 UnicastRemoteObject
或其他类型的远程对象(例如 Activatable
,RemoteObject
)来支持远程调用。这样,远程对象才可以通过 RMI 协议与客户端进行通信。
2. JNDI Reference
和 RMI 远程对象的结合
当通过 JNDI 加载一个 RMI 远程对象时,实际上这个对象是作为一个 Reference
对象存在的,而不是直接暴露为 RMI 远程对象的实例。
但如果 JNDI 只是用来查找和加载一个普通的对象(例如某个不需要远程调用的对象),那该对象就不需要实现 Remote
接口或继承 UnicastRemoteObject
。这种对象通常只用于配置、资源注入等目的,JNDI 通过 Reference
和 ObjectFactory
加载它们,而不涉及远程方法调用。
3. JNDI Reference
和恶意类
在安全攻击中,攻击者可能利用 JNDI 加载恶意类,通过远程引用进行反序列化。这时,目标类 不需要实现 Remote
接口,不需要继承 UnicastRemoteObject
,只要它能够通过 Reference
被加载和实例化即可。
4. 总结:
- 如果你的目标是通过 JNDI 加载一个 RMI 远程对象,那么是的,这个对象必须实现
java.rmi.Remote
接口,并通常需要继承UnicastRemoteObject
。 - 如果你只是通过 JNDI 加载一个 普通对象(例如用于配置或资源),那么它不需要实现
Remote
接口或继承UnicastRemoteObject
。
通过 JNDI 加载的对象不一定是 RMI 远程对象,即使它们是通过 rmi://
协议进行查找的。