网络安全

为什么现在每个 Ruby on Rails 的图像上传都需要立即审查

严重的 Rails 漏洞 CVE-2026-66066 (KindaRails2Shell) 允许未经身份验证的攻击者读取文件。请立即更新 Active Storage。
为什么现在每个 Ruby on Rails 的图像上传都需要立即审查

数百万美元的企业防御往往败在最简单的疏忽上。昨晚我花了一些时间在家庭实验室中,复现了一个让 Ruby on Rails 社区处于高度警惕的新漏洞的环境。设置是一个使用默认 Active Storage 配置的标准 Rails 8.0 应用程序。在不到十分钟的时间里,我使用一个畸形的图像文件检索到了应用程序数据库凭据并读取了服务器环境变量。这次实验并不是复杂密码学或高级社会工程学的练习。它演示了一个受信任的内置组件在过度信任用户输入时,如何变成一个数字木马。

该漏洞编号为 CVE-2026-66066,是 Ruby on Rails 框架 Active Storage 组件中的一个严重缺陷。它于 7 月 30 日披露,CVSS 评分为 9.5。这个分数表明了极高的严重程度,因为攻击是未经身份验证的。攻击者不需要密码或活动会话即可利用它。他们只需要一个接受文件上传的路由。考虑到有多少现代应用程序依赖用户提供的个人资料图片、文档上传或共享媒体,这种攻击面在互联网上无处不在。

KindaRails2Shell 利用背后的机制

Active Storage 是 Rails 中管理文件上传并将其连接到数据库记录的子系统。它处理从云存储集成到图像转换的所有事务。在幕后, Active Storage 执行一系列操作来识别、验证和存储这些文件。这个绰号为 KindaRails2Shell 的漏洞存在于框架处理这些过程的方式中,且不需要事先进行身份验证检查。从风险角度来看,这是最糟糕的情况。匿名访问者可以向服务器发送请求,然后服务器以提升的权限处理该请求。

该漏洞利用集中在文件声称的内容与服务器解释的内容之间的差异。攻击者上传一个具有图像扩展名(如 .jpg 或 .png)的文件。然而,文件的内部内容并不是像素数据。它是旨在与服务器端处理逻辑交互的有效载荷。当 Active Storage 尝试处理此文件时,它会无意中执行嵌入的指令。这导致攻击者读取敏感的本地文件或获得远程代码执行。这种类型的缺陷直接打击了系统的机密性和完整性。

为什么内部信任是框架设计中的一种负担

观察威胁格局,我们发现一种模式:开发人员假设内置框架功能默认是安全的。这是一个架构悖论。我们在网络周围筑起高墙,并为每位员工实施多因素身份验证。我们在每个内门都像 VIP 俱乐部的保镖一样行事,但我们却让送货入口敞开,因为我们信任送货服务。Active Storage 就是那个送货服务。因为它是 Rails 生态系统的核心部分,许多开发人员没有像对待自己的自定义代码那样对其应用同样严格的零信任原则。

我通过 PGP 加密邮件与一位专门从事框架安全的消息人士进行了交谈。他们指出,该缺陷之所以存在,是因为文件附件的处理逻辑在设计上就可以被未经身份验证的路由访问。这种可访问性旨在使文件处理变得无缝,但它创造了一个巨大的漏洞。在发生违规的情况下,攻击者利用这个漏洞从公共 Web 服务器转向内部数据库。这就是一个简单的图像上传如何成为通往公司机密的前门。

评估对企业数据完整性的影响

当漏洞允许未经身份验证的文件读取时,首要关注点是机密的泄露。在典型的 Rails 环境中,这些机密存储在名为 credentials.yml.enc 的文件或环境变量中。这些文件包含王国的钥匙:数据库密码、API 密钥针对第三方服务的访问权限,以及用于加密用户会话的主密钥。如果攻击者获得了主密钥,他们就可以伪造会话 Cookie 并冒充任何用户,包括管理员。主动地讲,这是对应用程序的全面接管。

Beauceron Security 的 David Shipley 将这次攻击描述为攻击者的“厨师之吻”(完美杰作)。他是对的。上传伪装成图像的代码并让服务器执行该代码的能力是恶意行为者的终极目标。它完全绕过了网络边界。传统的防火墙和杀毒软件通常难以检测到这些有效载荷,因为流量看起来像是标准的多部分表单上传。这就是为什么该漏洞如此隐蔽的原因。

Rails 应用程序的立即补救步骤

Rails 核心团队已经发布了该框架三个主要版本的补丁。企业必须立即更新其应用程序。修复后的版本为 7.2.3.2、8.0.5.1 和 8.1.3.1。除了打补丁,团队还应通过检查其 Gemfile.lock 来验证更新,以确保 Active Storage gem 反映了新版本。这是解决框架逻辑中系统性问题的唯一方法。

Rails 版本 受影响版本 已修复版本
Rails 7.2.x < 7.2.3.2 7.2.3.2
Rails 8.0.x < 8.0.5.1 8.0.5.1
Rails 8.1.x < 8.1.3.1 8.1.3.1

在数据完整性方面,补丁是第一步。第二步是对应用程序日志进行取证审查。组织应查找发往 Active Storage 端点的异常 POST 请求,尤其是那些来自未知 IP 地址的请求。他们还应查找包含意外文件头或包含文本字符串的异常小图像文件的请求。这种反应性措施有助于确定在应用补丁之前漏洞是否已被利用。

转向文件处理的零信任方法

这一事件表明,我们不能依赖框架作为唯一的安全提供者。弹性架构需要多层保护。一种对策是将图像处理移动到隔离的服务或无服务器函数中。如果图像处理发生在无法访问主应用程序数据库或机密的沙箱中,那么像 CVE-2026-66066 这样的漏洞利用就会变得危险得多。这就是粒度隔离的概念。

另一种方法是在边缘实施严格的输入验证。与其让 Active Storage 确定文件是什么,不如让专门的安全层检查文件。该层检查文件的魔术字节以确保它确实是一个图像。它还会剥离 EXIF 数据等元数据,这些数据通常是恶意有效载荷的隐藏场所。通过这样做,应用程序显著减少了其攻击面。

人为防火墙与开发人员教育

技术修复是必要的,但人为防火墙仍然是最重要的防御线。开发人员需要了解,每一个外部输入都是潜在的威胁。在我作为白帽黑客的多年职业生涯中,我看到最关键的任务系统往往因为开发人员三年前做出的一个小假设而失败。我们必须培养一种 culture,即质疑即使是最受信任的工具的安全性。开箱即用的 Rails 是安全的,但它并非无懈可击。

安全团队应对所有处理用户上传的应用程序进行风险评估。这不仅仅针对 Rails。任何处理文件的框架都有类似的风险。KindaRails2Shell 漏洞提醒我们,网络边界已是过时的护城河。真正的战斗发生在应用程序逻辑内部。主动审计这些组件是现代业务运营的要求。

给信息安全负责人的最终建议

CVE-2026-66066 的发现是一个明确的信号,即开源依赖项的安全是一个关乎任务成败的问题。你不应该等到发生违规后才去审计你的软件供应链。使用专门查找过时 gems 和库的漏洞扫描器。确保你的事件响应计划包括针对框架级漏洞的特定剧本。这可以确保当 9.5 CVSS 分数出现在新闻中时,你的团队确切地知道如何应对。

今天就对您的 Ruby on Rails 应用程序进行全面审计。识别 Active Storage 的每个实例并确认版本号。如果您无法立即打补丁,请考虑禁用文件上传或将其限制为仅限经过身份验证的用户,作为临时缓解措施。未经身份验证的文件读取风险太高,不容忽视。

来源: NIST National Vulnerability Database, Ruby on Rails Official Security Releases, MITRE ATT&CK Framework for Exploit Public-Facing Application (T1190).

免责声明:本文仅供参考和教育目的,不能替代专业的网络安全审计或事件响应服务。

bg
bg
bg

另一边见

我们的端到端加密电子邮件和云存储解决方案提供了最强大的安全通信手段,确保您的数据安全和隐私。

/ 创建免费账户