Skip to content

Solr 文件上传路径遍历漏洞(CVE-2024-52012)

漏洞介绍

Solr 在 Windows 上运行的实例容易受到任意文件路径写访问的攻击,这是由于“configset 上传”API 缺乏输入清理所致。恶意构造的 ZIP 文件可以使用相对文件路径将数据写入文件系统未预料到的部分。

影响范围

6.6 - 9.7.0

修复建议

用户建议升级到 9.8.0 版本,该版本修复了问题。无法升级的用户也可以通过使用 Solr 的“基于规则的认证插件”来限制对 configset 上传 API 的访问,以确保只能由一组受信任的管理员/用户访问,从而安全地防止问题发生。

漏洞复现

使用python构造一个恶意的zip文件。

import zipfile

# 创建ZIP文件并添加文件
with zipfile.ZipFile('0.zip', 'w') as zipf:
    zipf.writestr("../0.txt", "hello world, 0")
    zipf.writestr("../a.txt","hello world")
    zipf.writestr("../a.class.","class test")

然后在目标环境发送put请求上传恶意的zip文件。

image-20250205114330877

可以看到成功将a.txt和a.class上传到了上一级目录。

image-20250205114245334

漏洞分析

打开仓库的更新推送信息,https://github.com/apache/solr/commit/5795edd143b8fcb2ffaf7f278a099b8678adf396#diff-fb4471c6f2ee95d8ed60f9b5746ad282b1cdd59527d463061bb8c24090be57b3

看更新的主要代码,可以发下就是增加了isPathAChildOfParent函数检查目录逃逸。

image-20250205114548097

在org.apache.solr.handler.configsets.UploadConfigSetAPI#uploadConfigSet函数中调用了这个上传函数,这里是一个常见的存在漏洞地方。解压缩导致目录穿越。直接使用了ZipInputStream处理了传入的压缩包,在java的原生处理中,并没有对压缩包中特殊的文件名比如../a.txt做处理。这一点在其他语言中也常见。然后这里也没有进行其他的处理,直接将压缩包中每一项的信息使用了uploadFileToConfig函数进行了保存,就是上面截图中的函数。所以可以直接上传一个恶意的压缩包文件。

image-20250205115610316

在uploadFileToConfig函数中也可以看到在执行到写入文件钱还经历了两部分检测。第一个函数isFileForbiddenInConfigSets是黑名单后缀检测,禁止

"class", "java", "jar", "tgz", "zip", "tar", "gz"

这些后缀进行上传。第二个函数isFileForbiddenInConfigset是根据文件前字节的魔术字节匹配确定禁止的文件类型。

但是官方的漏洞介绍说在windows环境下存在这个风险,不知道是不是指可以通过Windows特性绕过后缀检测,比如a.class.这样。所以对描述中的Windows存在路径遍历还是不是很明白为什么这样说。

image-20250205120145399

参考链接

https://solr.apache.org/security.html#cve-2024-52012-apache-solr-configset-upload-on-windows-allows-arbitrary-path-write-access

https://github.com/apache/solr/commit/5795edd143b8fcb2ffaf7f278a099b8678adf396#diff-fb4471c6f2ee95d8ed60f9b5746ad282b1cdd59527d463061bb8c24090be57b3