当前位置:首页 > 综合 > java jmx 未授权访问漏洞 正文

java jmx 未授权访问漏洞

来源:烟消火灭网   作者:百科   时间:2026-10-17 05:53:15

2015年,授权某大型电商平台被曝出内部服务器遭入侵,访问攻击者没用什么高深漏洞,漏洞只是授权扫了一遍端口,发现几个开放的访问JMX端口没设认证,直接连上去读了数据库密码。漏洞这事当时在安全圈传得挺广,授权但很多人没当回事——JMX?访问那不是Java自带的管理工具吗,能出什么问题?漏洞

问题恰恰出在"自带"这两个字上。JMX(Java Management Extensions)是授权JDK从1.5开始就内置的管理框架,用来监控JVM运行状态、访问管理应用配置。漏洞默认情况下,授权JMX的访问远程连接是不需要认证的。你只要知道IP和端口,漏洞用jconsole或者jvisualvm就能连上去,看到堆内存、线程数、甚至直接调用MBean方法。

MBean是关键。JMX把所有可管理资源抽象成MBean,标准MBean暴露属性、操作和通知。很多中间件和框架会注册自己的MBean,比如Tomcat的Catalina:type=Server,你能通过它直接改配置。更危险的是,有些MBean的方法能执行任意代码。

举个例子。RMI是JMX远程连接的常见方式,通过RMI注册表暴露一个jmxrmi对象。攻击者连上后,可以调用MLet或者MBeanServerDelegate相关方法加载远程类。如果目标JVM没限制远程类加载,攻击者就能从自己的服务器上加载恶意MBean,直接getshell。

这不是理论。Metasploit里有个模块叫exploit/multi/misc/java_jmx_server,专门打这个。流程很简单:扫到1099端口(RMI默认端口)或者别的JMX端口,用jython或者marshalsec构造RMI payload,加载远程MBean,执行命令。整个过程不需要任何密码。

为什么会有未授权?因为JMX的默认配置就是开放的。Oracle的文档里写了怎么开启认证和SSL,但很多人不看。开发环境图方便,直接-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false,上了生产环境也这么干。运维不知道这个端口是干嘛的,防火墙也没拦。扫描器一扫一个准。

更隐蔽的是,JMX不一定监听1099。通过-Dcom.sun.management.jmxremote.port=xxxx可以指定任意端口。有些应用把JMX绑在0.0.0.0上,外网直接能访问。Shodan上搜java jmx或者jmxrmi,能出来一堆结果。国内某云厂商的监控代理就曾经默认开放JMX端口,后来被安全研究员报了个高危。

怎么防?最直接的是别把JMX暴露在公网。如果非要远程管理,开认证加SSL。具体参数:-Dcom.sun.management.jmxremote.authenticate=true,然后配jmxremote.password和jmxremote.access文件。密码文件权限要设成600,否则JVM会警告。SSL的话用-Dcom.sun.management.jmxremote.ssl=true,配好keystore和truststore。

但说实话,JMX这套认证机制设计得挺别扭。密码文件是明文存储的,权限控制靠文件系统。而且RMI协议本身有反序列化问题,就算开了认证,如果攻击者能控制RMI注册表,还是可能绕过。所以更稳妥的做法是:JMX只监听127.0.0.1,需要远程管理就通过SSH隧道转发。或者干脆用JMX over HTTP,走Servlet容器,至少能复用容器的认证体系。

还有个坑是jmxremote.port和jmxremote.rmi.port的区别。前者是RMI连接器端口,后者是RMI注册表端口。很多人只设了前者,结果JVM随机开一个端口给RMI注册表,防火墙规则就漏了。正确做法是两个都指定,或者用-Djava.rmi.server.hostname绑定内网IP。

我见过最离谱的案例是一个金融公司的测试环境,JMX端口开在公网,密码文件是默认的controlRole和monitorRole。攻击者连上去,通过MemoryPool MBean触发gc(),把服务搞挂了。这还算轻的,要是调用HotSpotDiagnostic的dumpHeap,能把整个堆内存导出来,里面全是业务数据。

JMX本身不是漏洞,它是把双刃剑。方便管理的同时,也方便了攻击者。很多Java应用默认开启JMX,但没人管。安全扫描器扫到JMX未授权,通常给个中危,因为利用需要一定Java知识。但真被盯上了,这就是个直通内网的后门。

检查方法很简单:nmap -p 1099,9999,9010 --script jmx-info <target>,或者直接用jconsole连一下。如果连上了没提示输密码,那就是未授权。赶紧关端口或者加认证。别等被挖矿了才想起来。

标签:

责任编辑:时尚