CVE-2026-46652:Goobi viewer 路径遍历致 RCE

数字馆藏展示系统 Goobi viewer 存在一处路径遍历漏洞,编号 CVE-2026-46652,CVSS 3.1 评分 9.8。问题出在外部文件下载组件:远端服务器返回的文件名被直接拼进目标路径,攻击者可以借此把任意内容写到 Tomcat 进程可写的任意位置,进而执行代码。

事件概述

Goobi viewer 由 intranda 维护,用于在浏览器里展示数字化馆藏,图书馆、档案馆、博物馆是主要使用方。受影响版本为 24.03 至 26.04,修复版本 26.05。公告由 GitHub Security Advisory GHSA-r386-2frm-w3v6 发布,10 月 23 日进入 NVD。

技术细节

漏洞链路很短,也因此危险。ExternalFilesDownloader.getFilename() 从远端服务器返回的 Content-Disposition 响应头里取出目标文件名,然后直接交给 Path.resolve() 处理。代码没有剥离目录分隔成分,也没有对绝对路径做拦截。

后果分两种走法:远端服务器在文件名里塞一个绝对路径,写入位置就完全由它决定;或者塞入 ../ 序列,把写入位置从预期目录向上跳出。两种走法都不需要认证,因为触发点是 viewer 主动去抓取外部资源这个动作本身。

接着是落地环节。只要目标路径在 Tomcat 进程的可写范围内,攻击者控制的内容就落了盘。如果把写入点选在已部署的 Web 应用目录,脚本可以直接被容器解析执行,最终以运行 Tomcat 的操作系统用户身份获得代码执行。

同批修复还包含另外三个问题:

  • CVE-2026-46651(9.8):DownloadTaskEndpoint 的 WebSocket 端点 /tasks/download/monitor.socket 接受未认证用户的下载请求
  • CVE-2026-55486(9.3):同批次的高危缺陷
  • CVE-2026-55442(5.3):SolrTools.cleanUpQuery() 用正则剥离 Solr 本地参数语法 {!…},但把本地参数再套一层花括号写成 {{!…}} 即可绕过——外层被剥掉,内层完整保留,合法的 Solr 本地参数被原样转发。这个缺陷在共享清洗函数里,影响所有经过 cleanUpQuery 的端点

影响评估

9.8 对应的是网络可达、无需权限、无需交互、机密性与完整性全失。真正决定暴露程度的不是分数,而是部署形态:Goobi viewer 这类系统常年挂在公网供读者检索,而”从外部站点抓取资源”往往是业务必需功能,关掉就意味着功能缺失。

攻击者只需一个能被 viewer 抓取的恶意 HTTP 服务器,利用率门槛低于典型的未认证 RCE。

修复建议

  • 升级至 26.05 或更高。四个 CVE 在同一个版本中一并修复,不建议按单个问题取舍
  • 升级后核查 Web 应用目录内是否存在非预期的脚本文件与近期新增文件,尤其是部署目录及其子目录
  • 审查 Solr 查询入口的访问日志,关注包含双花括号 {! 或 {{! 的查询串
  • 限制 Tomcat 进程对应用目录之外路径的写权限;应用目录本身不应允许运行时写入
  • 把外部资源抓取能力收敛到白名单域名,避免任意远端服务器参与文件名生成

一个 Content-Disposition 头就能换到代码执行,说明”抓取外部资源”这个动作本身就是信任边界,必须按不可信输入处理。

参考来源