博客
2016 年 4 月 6 日
RubyGems.org gem 替换漏洞的缓解措施
大卫·拉德克利夫
摘要
RubyGems.org 中的一个缺陷可能允许攻击者用他们提供的不同的文件替换我们服务器上的一些 .gem 文件。我们在 4 月 2 日部署了一个部分修复程序,并在 4 月 4 日部署了一个完全修复程序。我们还验证了自 2015 年 2 月 8 日以后上传的每个 .gem 文件,发现没有一个被替换。名称中包含短横线(例如“blank-blank”)且在此日期之前上传的 gem 应由其创建者验证。我们在下面提供了有关如何执行此操作的说明。
详细信息
2016 年 4 月 2 日,RubyGems.org 安全团队获悉了一个漏洞,该漏洞允许未经授权的用户在某些情况下更新现有 gem 版本的现有 gem 文件。安全团队评估该报告并确认了导致这种可能性发生的缺陷。我们于 4 月 2 日针对此问题部署了一个修复程序,并确认不再可能利用该漏洞。
经过进一步审查,我们发现了另一个未通过原始补丁修复的类似攻击媒介。我们在 4 月 4 日针对此问题部署了一个修复程序,并确认这也不再可能。
在这两种攻击媒介中,攻击者都可以利用 gem 和版本名称的组合强制替换我们 S3 存储桶中现有的 .gem 文件。
我们还发现不能通过标准 gem install
命令安装通过此方法推送到 gem 文件。
验证现有 gem
我们验证了所有 gem 中的 sha256 校验和,没有发现任何被恶意更改的 gem。我们仅从 2015 年 2 月 8 日开始计算 sha256 校验和关于 gem 的推送。在此日期之前推送到 gem 没有在推送时计算 sha256。因此如果 gem 在之前受到损害,我们没有办法对其进行验证。
澄清
- 2015 年 2 月 8 日之后推送到 gem:100% 已验证。
- 2015 年 2 月 8 日之前推送到 gem:自 2015 年 2 月 8 日以来没有发现更改的情况。
我们还验证了对于所有 gem 和所有日期,都没有第二种攻击媒介的情况。
为了采取额外的验证步骤,我们对两个或更多个包含同一文件 S3 对象版本的全部宝石进行了验证。我们在 S3 中发现了包含多个对象版本的750+宝石清单。我们逐一迭代多个对象版本,并将版本中的最近修改日期与数据库中条目创建日期进行了比较。我们从列表中发现了六枚具有大于五秒差值的宝石。在六枚宝石中,我们对不同版本运行了校验和,其中仅有两枚宝石拥有不同的校验和。我们手动在这些宝石的内容中运行了 Diff,并确保存宝石。
历史
这份安全漏洞的第一个部分已于 6 月 11 日,2014 提出。
第二部分已从 RubyGems.org 伊始便已存在。
影响
名称中带有破折号的宝石(例如,“空白-空白”)在 2014 年 6 月 11 日至 2016 年 4 月 2 日间推送的版本具有漏洞。(2015 年 2 月 8 日至 2016 年 4 月 2 日间推送的宝石已得到验证。)
我应该怎么办?
如果您拥有与影响部分相匹配的宝石版本
- 下载宝石
- 运行
gem unpack file.gem
- 确保其中未出现意外更改
- 运行
gem spec file.gem
- 确保未对 gemspec 出现意外更改
如果出现,请 gem yank
这些宝石,并尽可能快地联系 RubyGems.org 安全团队,并将 .gem 文件用于调查。
贡献人员
特别感谢 Eric Chapweske 发现漏洞并提供详细报告。感谢 David Radcliffe 和 Arthur Neves 开发修复方案和验证方案。感谢 Aaron Patterson、Nick Quaranto、André Arko 和 Samuel Giddins 进行审查和验证。