JMX 反序列化漏洞

前言

前段时间看到普元 EOS Platform 爆了这个洞,Apache James,Kafka-UI 都爆了这几个洞,所以决定系统来学习一下这个漏洞点。

JMX 基础

JMX 前置知识

JMX(Java Management Extensions,即 Java 管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX 可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。

可以简单理解 JMX 是 java 的一套管理框架,coders 都遵循这个框架,实现对代码应用的监控与管理。

JMX 的结构一共分为三层:

1、基础层:主要是 MBean,被管理的资源。分为四种,常用需要关注的是两种。

  • standard MBean 这种类型的 MBean 最简单,它能管理的资源(包括属性、方法、时间)必须定义在接口中,然后 MBean 必须实现这个接口。它的命令也必须遵循一定的规范,例如我们的 MBean 为 Hello,则接口必须为 HelloMBean。

  • dynamic MBean 必须实现 javax.management.DynamicMBean 接口,所有的属性,方法都在运行时定义。2、适配层:MBeanServer,主要是提供对资源的注册和管理。3、接入层:Connector,提供远程访问的入口。

JMX 基础代码实践

以下代码实现简单的 JMX demo,文件结构

 

代码解读

复制代码

├── HelloWorld.java ├── HelloWorldMBean.java └── jmxDemo.java

HelloWorldMBean.java

 

csharp

代码解读

复制代码

package org.example;​public interface HelloWorldMBean { public void sayhello(); public int add(int x, int y); public String getName();}​

HelloWorld.java

 

java

代码解读

复制代码

package org.example;​public class HelloWorld implements HelloWorldMBean{ private String name = "Drunkbaby"; @Override public void sayhello() { System.out.println("hello world" + this.name); }​ @Override public int add(int x, int y) { return x + y; }​ @Override public String getName() { return this.name; }}​

jmxDemo.java

 

java

代码解读

复制代码

package org.example;​import javax.management.MBeanServer;import javax.management.ObjectName;import javax.management.remote.JMXConnectorServer;import javax.management.remote.JMXConnectorServerFactory;import javax.management.remote.JMXServiceURL;import java.lang.management.ManagementFactory;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;​public class jmxDemo { public static void main(String[] args) throws Exception{ MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName mbsName = new ObjectName("test:type=HelloWorld"); HelloWorld mbean = new HelloWorld(); mBeanServer.registerMBean(mbean, mbsName);​ // 创建一个 RMI Registry Registry registry = LocateRegistry.createRegistry(1099); // 构造 JMXServiceURL,绑定创建的 RMI JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"); // 构造JMXConnectorServer,关联 mbserver JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, mBeanServer); jmxConnectorServer.start(); System.out.println("JMXConnectorServer is ready");​ System.out.println("press any key to exit."); System.in.read();​ }}​

其中

  • Probe Level:创建了 HelloWorldMBean 实例 mbean

  • Agent Level:创建了 MBeanServer 实例 mbs

  • Remote Management Level: 创建了JMXServiceURL,绑定到本地 1099 rmi

### 致远 JNDI 反序列化漏洞详情 在致远协同管理平台中存在JNDI反序列化漏洞,此漏洞允许远程攻击者通过精心构造的数据包执行任意代码。当应用程序尝试解析不受信任的输入并将其作为对象流处理时,如果这些数据被用于查找或创建资源,则可能触发恶意行为[^1]。 具体来说,在Java环境中,`javax.naming.InitialContext.lookup()`方法会根据传入的名字查询相应的服务提供者接口(SPI),而这个过程中可能会加载来自网络位置(如LDAP服务器)的对象定义文件。一旦攻击者能够控制这部分URL的内容,就可以诱导受害主机下载并实例化由攻击者指定的类,从而实现远程命令执行。 #### 解决方案 针对上述风险,建议采取以下措施: - **升级版本**:确保使用的致远产品是最新的稳定版,因为厂商通常会在新版本中修复已知的安全问题。 - **禁用不必要的功能**:对于不必要启用的功能模块应予以关闭,减少潜在的风险暴露面。 - **配置安全策略**:调整应用服务器的相关设置,比如限制RMI注册表访问权限、禁止外部连接到本地JMX端口等,以此降低利用此类漏洞的可能性。 - **依赖库更新**:定期审查第三方组件及其版本号,及时替换含有公开CVE编号的老化库项;特别是像Apache Commons Collections这样的常用工具集,历史上曾多次暴露出可被用来实施反序列化攻击的缺陷。 - **白名单机制**:引入严格的类加载器过滤规则,只允许特定路径下的可信字节码参与运行时环境中的动态加载流程,从根本上杜绝非法类型的注入途径。 ```java // 设置JVM参数以增强安全性 -Dcom.sun.jndi.rmi.object.trustURLCodebase=false \ -Dcom.sun.jndi.cosnaming.object.trustURLCodebase=false \ -Dcom.sun.jndi.ldap.object.trustURLCodebase=false ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值