获得更好的Ruby Gemfile安全的方法

208 阅读6分钟

Ruby是一种定义明确且经过深思熟虑的语言,自1990年代中期以来一直存在。2004年,Ruby纳入了RubyGems作为其包管理器。RubyGems是用来管理库和依赖关系的,其自成一体的格式被称为宝石。RubyGems的界面是一个命令行工具,与Ruby运行时集成,允许在项目中添加或更新Gemfiles。

我查看了三个Ruby平台,发现了一些即使对我来说也很惊讶的漏洞。下面是如果你想获得更好的Ruby Gemfile安全,应该注意什么,以及如果你发现了漏洞应该怎么做。

包管理的作用

像其他语言一样,Ruby在软件包管理方面有一些选择。其中一个更广泛用于应用管理的是Bundler,它实际上最初是作为Ruby gem安装的。

像Bundler这样的软件包管理器可以在一个Gemfile中安装许多宝石,而RubyGems则需要使用gem install ,逐一安装。当你有一个庞大的宝石集需要维护或安装在一个应用程序中时,这简化了Ruby包的管理。

当涉及到维护应用程序中的库和依赖关系时,软件包管理器无疑使生活更容易。然而,重要的是要知道你正在使用什么,以及你的堆栈中可能出现的风险。像安全扫描这样简单的事情可以快速完成,以确定可能出现的问题,从而节省时间、金钱和你的终端用户的信任。

对漏洞的观察

在我们深入探讨我在扫描过去使用的平台时发现的问题之前,我想指出几件事。

  • 作为这些平台的用户/开发者,我对我的发现感到惊讶。这加强了一个想法,即不断地建立意识和教育对于安全地发展是最重要的。
  • 在下面所有的例子中,我都与每个社区讨论了这些漏洞,并确保他们意识到了这些问题,尽管许多人已经有了修复措施。

Spree商业

Spree是Ruby生态系统中比较常用的电子商务平台之一。 它一直是我的电子商务开放源码的首选之一。Spree自2007年以来一直存在,并且有一个庞大的开发者和公司社区帮助维护它。

扫描的第一步是创建一个Gemfile.lock manifest,可以使用Snyk CLI工具进行扫描。在克隆spree资源库并运行Bundle安装后,就会用项目中Gemfile清单中的所需Gemfile库和依赖项来创建lockfile。

给安装了MariaDB的OSX和brew用户一个提示。在Bundler安装过程中,MySQL2 gem安装可能会出现错误。 我不得不先brew install openssl ,并使用以下方法设置路径export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/

一旦锁文件创建完毕,运行 [snyk test](https://snyk.io/blog/snyk-cli-cheat-sheet/).我的返回了以下中等程度的漏洞。

Tested 142 dependencies for known issues, found 2 issues, 84 vulnerable paths.


Issues with no direct upgrade or patch:
  ✗ Information Exposure [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-ACTIONCABLE-20338] in actioncable@6.1.4
    introduced by spree@4.3.0.alpha > spree_core@4.3.0.alpha > active_storage_validations@0.9.5 > rails@6.1.4 > actioncable@6.1.4 and 1 other path(s)
  No upgrade or patch available
  ✗ Web Cache Poisoning [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-RACK-1061917] in rack@2.2.3
    introduced by actionpack@6.1.4 > rack@2.2.3 and 81 other path(s)
  No upgrade or patch available

在上述扫描中,有两个问题被确定为中等严重程度。

信息暴露是通过一个名为alpha 的 gem 与spree_core 的间接依赖关系引入的。顾名思义,它可以导致数据从核心平台上被远程检索。

网络缓存中毒是另一个被发现的漏洞,它是通过一个名为actionpack 的宝石的间接依赖关系引入的。这实质上使攻击者能够欺骗服务器缓存,对有效的请求做出恶意响应。请看这篇关于缓存中毒的文章,以获得更深入的阅读。

Sinatra

Sinatra是一个轻量级和可移植的Web服务器。它不仅是我最喜欢的演示和小型应用程序之一,而且它还使应用程序的运行速度超快,并能快速运行。迄今为止,它的下载量已超过1.6亿次,被广泛用于各种项目。

这次我用Bundler将init捆绑在一个新的目录中,创建了一个空白的Gemfile,然后编辑了gem文件,在文件的底部添加了gem 'sinatra' 。我还添加了一个名为erubis 的gem,这是一个常用的HTML模板gem,可以实现快速的前端开发(而且它与Sinatra非常匹配)。

# frozen_string_literal: true

source "https://rubygems.org"

gem 'sinatra'
gem 'erubis'

保存好Gemfile后,通过运行bundler install ,安装所有需要的gem依赖项。等待几秒钟后,软件包管理器将创建一个Gemfile.lock manifest,并准备进行安全扫描。我的扫描结果显示如下。

Tested 7 dependencies for known issues, found 2 issues, 3 vulnerable paths.


Issues with no direct upgrade or patch:
  ✗ Cross-site Scripting (XSS) [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-ERUBIS-20482] in erubis@2.7.0
    introduced by erubis@2.7.0
  No upgrade or patch available
  ✗ Web Cache Poisoning [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-RACK-1061917] in rack@2.2.3
    introduced by sinatra@2.1.0 > rack@2.2.3 and 1 other path(s)
  No upgrade or patch available

erubis gem的漏洞(CWE-79)是我挖掘的一个漏洞。文档中包含一个不正确的转义方法,可能使应用程序受到XSS攻击。在erubis文档中,许多例子使用了<%= expr %> ,这不是转义存储的模板变量。为了正确地转义,并确保存储的HTML元素不被输出到模板中,它们需要像这样转义:<%== expr %>

作为一名开发人员,不仅要在代码层面上扫描漏洞,而且还要了解威胁,这是开发安全尽职调查的一部分,这一点始终很重要。

Rails上的Ruby

Rails是Ruby生态系统中所有宝石中使用最广泛的一个。RubyGems的总下载量超过2.93亿次,它是网络应用程序开发的一个明显和流行的选择。

使用Snyk漏洞数据库做了一些尽职调查,我看到了一些需要警惕的版本。然而,目前的版本(在撰写本文时为6.1.4)没有已知的漏洞。

运行gem install rails 然后通过运行rails new myapp 创建一个空白 Rails 项目。这将创建一个新的空白Rails模板来构建一个应用程序。一旦库和依赖关系被设置好,我就用以下方法进行安全扫描 [snyk test](https://snyk.io/blog/snyk-cli-cheat-sheet/).它在软件包清单中发现了以下漏洞。

Tested 72 dependencies for known issues, found 2 issues, 36 vulnerable paths.


Issues with no direct upgrade or patch:
  ✗ Information Exposure [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-ACTIONCABLE-20338] in actioncable@6.1.4
    introduced by rails@6.1.4 > actioncable@6.1.4
  No upgrade or patch available
  ✗ Web Cache Poisoning [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-RACK-1061917] in rack@2.2.3
    introduced by capybara@3.35.3 > rack@2.2.3 and 34 other path(s)
  No upgrade or patch available

进一步挖掘这些漏洞,我可以看到Action Cable gem,它是Rails的一个依赖项,有一个潜在信息暴露的警报。这个问题似乎是在2016年被发现的,在核心框架库中没有得到补救修复。在深入研究了Snyk漏洞数据库中列出的PR后,我发现了一个基于代码的解决方法,反而缓解了这个问题。这是在2019年提出的。

另一个问题是由Rack gem引入的,也是围绕网络缓存中毒的,与上面的spree commerce问题相同。