通过OPSWAT 红队进行的全面安全分析,安全研究人员 Thai Do 和 Minh Pham 发现了影响 Rack Ruby 框架的多个漏洞,特别是CVE-2025-25184、CVE-2025-27111 和CVE-2025-27610。
本文详细概述了这些漏洞,尤其关注 CVE-2025-27610。文章研究了这些漏洞的根本原因,评估了潜在影响,并概述了有效的缓解策略,以确保依赖 Rack 框架的应用程序的安全。
机架概述
Rack 是一个模块化接口,用于连接网络服务器和基于 Ruby 的网络应用程序。它通过将 HTTP 请求和响应封装为单个方法调用来规范这些组件之间的交互,从而简化了开发过程,并提高了各种框架和服务器之间的兼容性。
许多 Ruby 网络框架和库都使用 Rack,如 Ruby on Rails 和 Sinatra。它可以作为 Ruby gem 提供。Rack 在全球的广泛应用(全球下载量超过 10 亿次)彰显了它在 Ruby 开发生态系统中不可或缺的作用。Rack::Static 和 Rack::Sendfile 等中间件组件通过处理静态内容交付和优化文件传输提高了效率。由于这种广泛的集成,在 Rack 中发现的漏洞具有重大的安全影响,可能会影响全球众多的应用程序和系统。
在机架中发现安全漏洞
在最近对 Rack 中间件框架进行的安全研究中,OPSWAT 的研究人员 Thai Do 和 Minh Pham 发现了几个对基于 Ruby 的网络应用程序构成重大安全风险的漏洞:
- CVE-2025-25184:Thai Do 发现一个漏洞,攻击者可通过 CRLF(回车换行)字符执行日志注入,从而操纵日志条目。
- CVE-2025-27111:Minh Pham 发现了一个安全漏洞,允许攻击者通过恶意标头值注入和操纵日志内容。
- CVE-2025-27610:Minh Pham 还发现了一个路径遍历漏洞,该漏洞可使攻击者在未经授权的情况下访问位于指定静态文件目录之外的文件,从而构成重大安全威胁。
在这些漏洞中,CVE-2025-27610尤其严重,因为它可能使未经身份验证的攻击者检索敏感信息,包括配置文件、凭证和机密数据,从而导致数据泄露。该漏洞的 CVSS 得分为 7.5,属于高严重性风险。
Rack::Static 和本地文件包含漏洞
了解 Rack::Static
Rack::Static是 Rack 应用程序中必不可少的中间件,主要用于高效地提供 JavaScript、CSS 和图片等静态文件。利用 Rack::Static,开发人员可以将静态内容服务无缝集成到 Ruby 应用程序中,而无需依赖额外的网络服务器配置。
在配置 Rack::Static 时,有两个重要选项尤为突出--:urls和:root。正确理解和使用这两个选项,可以大大简化和精简静态文件服务流程。
1.:urls 选项
:urls 选项指定 Rack 应用程序应将哪些 URL 路径作为静态资产处理。它以字符串数组的形式提供,每个字符串代表一个触发静态文件处理的路径前缀。
例如
在此配置中,Rack::Static 会拦截并处理对 /images、/css 或/js的请求。任何与这些路径相匹配的文件都将直接从文件系统中提供。
2.根选项
:root 选项定义了提供静态文件的基本目录。该目录相对于 Rack 应用程序的当前工作目录。
鉴于前面的例子:
当请求指向/assets/logo.png 时,Rack::Static 会尝试为位于public/assets/logo.png 的文件提供服务。
实例
通过 :urls 和 :root 选项有效实施 Rack::Static,为 Ruby 网络应用程序中的静态内容提供了一种有组织、高性能的方法:
在这种情况下,对 /assets/* 和 /favicon.ico 的请求将自动由 Rack::Static 处理。所有相应文件应分别存在于 public/assets 目录和 public/favicon.ico 中。
CVE-2025-27610 技术细节
在对Rack::Static 进行广泛安全分析期间,Minh Pham 发现了一个与 :root 选项处理不当有关的重大漏洞。具体来说,当 :root 参数没有明确定义时,Rack 会将其默认为当前工作目录,并将其赋值为 Dir.pwd,从而隐式地将其指定为 Rack 应用程序的网络根目录。
值得注意的是,Rack::Static 直接将传入的 URL 路径与指定的 :root 目录连接起来,而没有进行充分的验证或消毒。因此,如果 :root 选项相对于 :urls 选项未定义或配置错误,未经身份验证的攻击者就可能通过路径遍历技术利用此漏洞访问预定网络目录之外的敏感文件。
下文将详细分析 Rack::Static 的请求处理流程,清楚地说明如何利用这一漏洞。
Rack::Static 中的路径遍历和本地文件包含漏洞
为了深入了解 Rack::Static 中间件是如何处理请求的,Minh Pham 对 Rack 的源代码进行了全面分析。在 Rack::Static 类的初始化过程中,他发现如果没有明确定义 :root 选项,Rack::Static 默认从当前工作目录(Dir.pwd)提供文件。因此,省略该选项会导致中间件隐式使用执行应用程序的目录。
初始化后,我们发现当 Rack::Static 收到 HTTP 请求时,会调用调用方法。
随后,Rack::Static 将文件服务操作委托给 Rack::Files,后者会根据从配置的 :root 目录和用户提供的 PATH_INFO 导出的构建文件路径,尝试定位并提供文件。
首先,通过调用 can_serve(path) 和 overwrite_file_path(path) 方法,中间件会检查 env["PATH_INFO"],以确定传入请求是否与任何已配置的 URL 前缀(如 /static、/public)相匹配。
如果满足条件,Rack::Static 会将配置的根目录(:root)与用户提供的 PATH_INFO 结合起来,构建文件路径。在构建过程中,没有对输入路径进行适当的规范化或消毒处理。具体地说,中间件直接将传入请求中的 PATH_INFO 与 :root 选项指定的目录连接起来,由于对所提供路径的验证不足而引入了一个漏洞
Minh Pham 发现,由于该工作流中缺乏适当的消毒或验证,如果用户提供的 PATH_INFO 包含目录遍历序列,且 :root 选项未明确定义,则构建的文件路径可能会解析到预定根目录之外的位置,从而可能暴露敏感文件。
CVE-2025-27610 概念验证
为了演示 Rack::Static 中的这一漏洞,我们利用 Rack 3.1.10 版开发了一个基于 Ruby 的网络应用程序。在应用程序未明确定义 :root 选项的情况下,未经身份验证的攻击者可利用此漏洞访问敏感数据,如凭证、配置文件或数据库文件,从而可能导致重大数据泄露。
请参阅以下视频,详细了解与此漏洞相关的重大影响:
缓解和指导
为减少上述漏洞,请确保您的系统已更新到最新版本的 Rack。
使用 SBOM 引擎的MetaDefender Core 可以检测到这一漏洞。
OPSWAT MetaDefender Core配备了先进的SBOM软件 物料清单)功能,使企业能够采取积极主动的方法来应对安全风险。通过扫描软件应用程序及其依赖关系,MetaDefender Core 可识别所列组件中的已知漏洞,如 CVE-2025-27610、CVE-2025-27111 和 CVE-2025-25184。这样,开发和安全团队就能确定修补工作的优先次序,在潜在的安全风险被恶意行为者利用之前将其降低。
以下是MetaDefender Core 通过 SBOM 检测到的 CVE-2025-27610、CVE-2025-27111 和 CVE-2025-25184 的截图: