当前位置: 首页 > news >正文

别再让Solr 5.x-8.3.1成为突破口:手把手复现CVE-2019-17558并配置安全加固

Solr安全实战:从CVE-2019-17558漏洞验证到企业级防护体系构建

当企业搜索服务突然成为攻击者的跳板时,运维团队的每一秒都价值千金。2019年曝光的Velocity模板注入漏洞(CVE-2019-17558)至今仍在影响大量未升级的Solr实例,攻击者仅需发送特制请求就能在服务器上执行任意命令。本文将带您深入漏洞本质,不仅演示验证方法,更构建从应急响应到长效防护的完整解决方案。

1. 漏洞深度解析与技术验证

1.1 漏洞形成机制剖析

Velocity模板引擎原本是Solr用于动态生成响应内容的工具,但当params.resource.loader.enabled配置开启时,攻击者可以注入恶意模板代码。其本质是Java反射机制被滥用:

// 恶意模板中的关键代码片段 #set($rt=$x.class.forName('java.lang.Runtime')) #set($chr=$x.class.forName('java.lang.Character')) #set($ex=$rt.getRuntime().exec('whoami'))

影响版本范围

  • Apache Solr 5.0.0 至 8.3.1
  • 默认配置下需手动开启危险参数才可触发

1.2 企业环境验证方案

建议使用隔离的测试环境进行验证,以下是安全验证步骤:

  1. 核心发现(需替换实际地址):

    curl "http://solr-server:8983/solr/admin/cores?indexInfo=false&wt=json"
  2. 配置检查(以demo核心为例):

    GET /solr/demo/config HTTP/1.1 Host: solr-server:8983

    重点关注响应中的:

    { "queryResponseWriter": { "velocity": { "params.resource.loader.enabled": "false" } } }
  3. 无害化验证命令(推荐使用无害命令):

    GET /solr/demo/select?q=test&wt=velocity&v.template=custom&v.template.custom=%23set(...省略编码后的date命令...) HTTP/1.1

注意:实际验证时应使用date等无害命令替代原文中的hostname,避免生产环境影响

2. 紧急加固与配置优化

2.1 立即生效的防护措施

通过以下API即时关闭危险参数(示例使用curl):

curl -X POST -H "Content-Type: application/json" -d '{ "update-queryresponsewriter": { "name": "velocity", "params.resource.loader.enabled": "false" } }' http://solr-server:8983/solr/demo/config

关键参数对照表

参数名称安全值风险值作用
params.resource.loader.enabledfalsetrue禁用外部模板加载
solr.resource.loader.enabledfalsetrue禁用资源加载器
template.base.dir空或受控目录/限制模板目录

2.2 网络层防护策略

结合企业防火墙实施纵深防御:

  1. 访问控制列表

    # iptables示例(需根据实际调整) iptables -A INPUT -p tcp --dport 8983 -s 10.0.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 8983 -j DROP
  2. WAF规则示例(适用于ModSecurity):

    <SecRule REQUEST_URI "/solr/.*select.*wt=velocity" "phase:1,deny,id:10001" SecRule ARGS_GET:v.template.custom "@contains java.lang.Runtime"

3. 版本升级与迁移方案

3.1 升级路径规划

版本选择建议

  • 当前版本 ≤ 7.0 → 升级至 8.11.2+
  • 7.x/8.x → 升级至最新8.11.x或9.x

平滑升级步骤

  1. 备份关键数据:

    # 备份配置 tar -czvf solr_config_backup.tar.gz /opt/solr/server/solr/*/conf # 备份索引 curl "http://localhost:8983/solr/admin/collections?action=BACKUP&name=pre_upgrade"
  2. 使用Solr内置的滚动重启:

    bin/solr restart -c -z zoo1:2181 -p 8983

3.2 升级后验证清单

  1. 核心功能测试:

    # 索引测试 curl -X POST -H 'Content-Type: application/json' \ -d '[{"id":"test1","title":"upgrade test"}]' \ "http://localhost:8983/solr/gettingstarted/update?commit=true" # 查询测试 curl "http://localhost:8983/solr/gettingstarted/select?q=*:*"
  2. 安全配置复核:

    grep -r "params.resource.loader.enabled" /opt/solr/server/solr/

4. 构建企业级Solr安全体系

4.1 安全监控方案

日志监控关键指标

  • 异常的Velocity模板请求
  • 频繁的config API调用
  • 非常规的Java类加载

Prometheus监控示例

scrape_configs: - job_name: 'solr' metrics_path: '/solr/admin/metrics' static_configs: - targets: ['solr-server:8983']

4.2 长效安全机制

  1. 定期安全审计脚本

    import requests from urllib.parse import quote def check_solr_vulnerability(url): test_cmd = quote("#set($x='')...省略编码后的date命令...") try: resp = requests.get(f"{url}/select?q=test&wt=velocity&v.template.custom={test_cmd}") return "Dec 2023" not in resp.text # 检查无害命令响应 except: return False
  2. 安全配置基线

    <!-- solrconfig.xml安全片段 --> <queryResponseWriter name="velocity" class="solr.VelocityResponseWriter"> <str name="template.base.dir">${solr.install.dir:}/restricted_templates</str> <bool name="params.resource.loader.enabled">false</bool> <bool name="solr.resource.loader.enabled">false</bool> </queryResponseWriter>

在电商平台的实际运维中,我们曾通过自动化监控发现某业务线Solr集群每小时遭受超过200次漏洞探测请求。通过及时关闭危险参数并升级版本,成功在攻击者得手前完成防护。建议企业建立季度性的搜索服务安全评审机制,将配置检查纳入持续交付流水线。

http://www.jsqmd.com/news/974500/

相关文章:

  • PUMA560六轴机械臂Matlab仿真包:带重力补偿的PD关节控制+实时逆动力学求解
  • 新版游戏账号与游戏币交易平台搭建全攻略
  • 告别乱码!手把手教你用Qt Linguist搞定软件多语言翻译(附完整代码)
  • 告别ActiveX!用Chrome/Vue.js调用本地EXE并传参的完整避坑指南
  • 学习型索引与B+树的自适应混合方案
  • i.MX 8处理器ECC内存保护:原理、配置与工程实践全解析
  • 5分钟搞定屏幕实时翻译:Translumo让你的外语游戏和视频无障碍
  • 佛山家具工厂选购指南:3家靠谱意式家具厂深度测评(2026) - 讲清楚了
  • 欧氏TSP最短环的几何构造法:从凸包到Delaunay确定性求解
  • Mythos安全模型:从辅助工具到自主攻防代理的范式跃迁
  • 如何快速掌握Horos:macOS平台免费医疗影像查看器的完整指南
  • 【Kafka源码解读和使用指南】第14篇:Kafka分区器源码解析——消息去哪个分区,有学问!
  • 基于大模型的SQL智能改写与性能优化
  • 保姆级教程:用ArcGIS Pro给地理坐标DEM算坡度,从数据准备到结果验证全流程
  • 从一次内部攻防演练看Solr CVE-2019-17558:攻击链分析与Java安全编码启示
  • 赣州市2026年黄金回收白银回收铂金回收 5 家高性价比门店实地测评盘点 - 干豆腐啊
  • 别再死记硬背了!用‘买车’和‘拼乐高’的比喻,5分钟搞懂群同构与同态
  • 欧氏旅行商问题(Euclidean TSP)实战指南:从几何特性到工业级近似算法
  • 2026年电话交换机厂家推荐:国产替代加速落地,这五家企业凭实力领跑市场 - 品研笔录
  • 免费CAJ转PDF终极指南:3步搞定知网文献格式转换
  • 银行AI模型上线后90%故障源于系统集成,而非算法本身
  • 前端如何优雅地调用Wegame这类客户端?一个注册表+本地服务的实战方案
  • 保姆级教程:用Qt 6.2.1的MaintenanceTool安装QtCharts模块(避坑MinGW编译器匹配)
  • 掌握GitHub加速插件:让你的下载速度提升10倍的终极指南
  • 星域社区全端源码功能实测与效果展示
  • EdgeRemover深度解析:Windows系统Edge浏览器管理终极指南
  • 3分钟上手AMD Ryzen调试神器:SMU Debug Tool终极使用指南
  • 用Python从零实现一个运动学自行车模型(附完整代码与可视化)
  • 低成本MCU实现USB音频同步模式:KL27无PLL时钟同步方案
  • 数据虹膜:一种聚焦-识别-验证的数据观察范式