Rails Security (上)

乌云历史资料库 · · The Attic

乌云历史资料归档

原始作者: Lobsiinvok 原始编号: superkieran-wooyundrops:1077 原始发布时间: 2016-03-09 10:20 声明:内容仅用于技术研究和个人使用,版权归 wooyun.org。


Author: Lobsiinvok

0x00 前言

Rails是Ruby广泛应用方式之一,在Rails平台上设计出一套独特的MVC开发架构,采取模型(Model)、外观(View)、控制器(Controller)分离的开发方式,不但减少了开发中的问题,更简化了许多繁复的动作。 此篇讲稿分为上下部份,因为最近在开发Rails,需要针对安全问题做把关,便借此机会针对历史上Rails发生过的安全问题进行归纳与整理。 这篇讲稿承蒙安全领域研究上的先进,在自行吸收转​​换后,如有笔误或理解错误的地方还望各位见谅并纠正我,感谢 :D

快速跳转

  • Mass assignment

  • Unsafe Query Generation

  • Content_tag

  • YAML.load

  • Dynamic Render Path

  • Reference

0x01 Mass assignment

  • 让Rails developers爱上的毒药(toxic)

  • ActiveRecord在新增物件时可传入Hash直接设定多项属性

  • 若没有限制可传入的参数会造成物件属性可被任意修改

原文图片

  • 透过新增/修改送出的属性,可以变更任意物件属性

  • Case

  • Rails 3.2.3后,config.active_record.whitelist_attributes = true

原文图片

  • Rails 4后,Rails Core内建strong_parameters

  • 更适当地将处理的过程锁定在Controller layer

  • 更有弹性地针对属性作过滤

0x02 Unsafe Query Generation

  • Rake在处理params时,有时候会产生Unsafe的query

原文图片

  • 透过伪造params[:token]成[], [nil], [nil, nil, ...]或['foo', nil],都能够通过.nil?的检查,使得SQL语句被安插IS NULL or IN ('foo', NULL)造成非预期的结果

  • 在Rails 3.2.8增加deep_munge方法来消除掉Hash里的nil

  • commit中可看到类似的检查

原文图片

Code for Testing

原文图片

Rails 3.1.0: 成功绕过nil?的检查

原文图片

Rails 4.2.5: 被拦截,直接替换成nil

原文图片

0x03 Content_tag

Rails提供content_tag方便产生HTML

  • 尽管方便,产生出的HTML是safe的吗?很显然的并不是!

  • Ref: brakeman

原文图片

  • In latest rails 4.2.5, attr still can be injected with any html data.

原文图片

  • 尽管attr values​​有escape,但跟button_to一起作用时却……

原文图片

Why?

  • Content_tag回传html_safe的字串,代表此字串在后续输出时不再做escape

  • 建立在attacker无法构建html_safe型的字串(等价于raw)

  • 丢给button_to时因为不再做escape导致XSS问题

0x04 YAML.load

难得一见的RCE漏洞(CVE-2013-0156)

  • 主因出在YAML

  • CVE-2013-0156发生在可透过YAML解析时指定tag的方式覆盖已经载入的instance

  • 在rails3后已从DEFAULT_PARSERS移除

原文图片

  • 此次问题发生在XML解析

  • 在解析时会经过Hash.from_xml(request.raw_post),底处是到typecast_xml_value进行xml的处理,这篇前辈的文章解释得很清楚,因为typecast_xml_value里针对xml node type可以进行YAML的解析调用(允许的type定义在ActiveSupport::XmlMini::PARSING),因此造成RCE问题

  • 透过patch可以更明显看到修补后的不同

原文图片

原文图片

Ref: Rails 3.2

Proof

Rails 3.1: 成功执行指令

原文图片

难得一见的RCE漏洞(CVE-2013-0333)

  • CVE-2013-0333问题一样发生在YAML.load

  • 在rails 3.0.19(含)前,rails3.0.x的JSON Parser竟然是使用YAML作为Backend

  • 问题发生在YAML backend中的convert_json_to_yaml

  • 这篇讲得很详细

  • Patch for CVE-2013-0333

原文图片

Rails 3.0.20

0x05 Dynamic Render Path

Render是处理request的一连串过程

  • 除了Insecure Direct Object Reference的安全问题,DEVCORE也在进行渗透测试时发现潜在的RCE问题

  • rails目前最新版本4.2.5预设也是用ERB去做样板处理,但在rails5开发过程中已经加入此次commit

  • 动态样板间接变成LFI问题,搭配上面所述的default_template_handler为ERB,只要找到有调用ruby code的样板或是可自行写入的档案,就能够造成RCE

原文图片

原文图片

  • 真实环境下发生的问题可以前往DEVCORE查看

  • 如果有类似开发环境应立即处理,default_template_handler要到rails5才转换成RAW

  • 改以白名单的方式限制template名称或是根据commit的内容手动Patch

0x06 Reference

Replies