Ruby 关于 Rails - 当 gem 在其 Gemfile HTTP 源中使用时,中间人攻击?

Ruby On Rails - man in the middle attack when a gem uses in its Gemfile HTTP source?

我是 运行 一个针对我正在开发的应用程序的安全扫描器,它正在上升红色警报,gem rotr 在其 Gem 文件中使用的最大安全线程带有 HTTP 协议的源揭示了中间人攻击的可能性,这种攻击可能允许攻击者将任何代码注入应用程序

link 到 Gem 有问题的文件 - https://github.com/mdp/rotp/blob/master/Gemfile

它指出:

source 'http://rubygems.org'

如果这个 gem 被列为依赖项并且在我的 Gem 文件中我正在使用:

source 'https://rubygems.org'

我试图找出它究竟是如何工作的,但没能做到。

即捆绑器的工作方式:

  1. 它从 https://rubygems.org 中提取我指定的所有 gems,然后它分别提取所有依赖项每个 gem,来自每个 Gem 文件中指定的源(对于每个 gem)并且在 ropt gem 的情况下,它从 http://rubygems.org 中提取(不是 https) - 因此在安装 ropt gem

    时为中间人攻击打开了理论上的可能性
  2. Bundler 从我的 Gem 文件 (https://rubygems.org) 因此,即使 Gem 指定 http://rubygems.org(不是 https)- 它将通过安全协议从我指定的位置拉出,因此理论上没有中间人攻击的可能性

在您的示例中,gem 将通过 HTTPS 加载,因为根本不会加载依赖项的 Gemfile。从依赖关系中,只有 gemspec 文件被 Bundler 评估。 gem 的 Gemfile 仅在 gem 的开发过程中使用。在这种情况下有趣的阅读:如何 bundler priorities sources.


以下内容供感兴趣的 reader 为什么在下载 gem 时使用 HTTPS 很重要:

当您从非 HTTPS 源加载 gem 并且存在中间人攻击者时,此攻击者将能够向您发送任何内容而不是 gem 你请求了。

当然还有人ifswhens。但是让我们假设您要在非安全通信通道(如纯 HTTP)上下载 gem。让我们假设有一个中间人攻击者能够嗅探您的流量。当在咖啡馆或酒店使用相同的 WiFi,或者当数据中心的虚拟服务器上有不同的客户,或者他们可以物理访问您的固定电话时,这可能是可能的。

因为他们可以读取您对 gem 的未加密请求,然后知道您使用的是什么 gem。现在想象一下,他们不仅会嗅探您的流量,还会操纵服务器对您的响应。例如,当您请求流行 gem 的新版本来处理用户身份验证和授权或付款时,他们可以将您的版本而不是原始版本发回给您。

他们的版本可能包含一些小的变化,例如:

  • 加载后 gem 可以将您的 Gemfile 上传给攻击者,这将使攻击者对您的应用程序有一个很好的了解。
  • 加载时 gem 可以获取所有 ENV 变量 and/or Rails.credentials 并将它们上传到攻击者控制的服务器。这肯定会 git 攻击者获取您应用程序的所有密码。
  • 因为它改变了原始 gem 处理用户凭据的方式,恶意 gem 将能够在用户登录或更新其凭据时跟踪用户或您的管理员凭据。鉴于许多用户在任何地方都使用相同的 email/password 组合,这将是一场噩梦。
  • 如果 gem 可以读取 ENV 变量或 Rails.credentials 那么这意味着它也可以改变它们。例如,连接到另一个支付提供商意味着您客户的付款将被重定向到另一个帐户。
  • 最重要的是,一旦恶意 gem 被加载到内存中,它也可以用原来的 gem 替换自己。是什么让你很难确定你的服务器被攻击了。

tl;dr 当攻击者能够进行中间人攻击时,他们就可以向您发送 gem 的恶意版本。这些恶意 gem 几乎可以对您的应用程序执行您可以想象的所有操作。当然,这样的攻击并不简单,但也不是特别难。

经验法则是:尽可能始终使用 HTTPS(不仅用于下载 gem,还用于所有网络流量)。