Author: Lobsiinvok

0x00 前言


Rails是Ruby广泛应用方式之一,在Rails平台上设计出一套独特的MVC开发架构,采取模型(Model)、外观(View)、控制器(Controller)分离的开发方式,不但减少了开发中的问题,更简化了许多繁复的动作。

此篇讲稿分为上下部份,因为最近在开发Rails,需要针对安全问题做把关,便借此机会针对历史上Rails发生过的安全问题进行归纳与整理。

这篇讲稿承蒙安全领域研究上的先进,在自行吸收转​​换后,如有笔误或理解错误的地方还望各位见谅并纠正我,感谢 :D


快速跳转

0x01 Mass assignment


  • 让Rails developers爱上的毒药(toxic)
  • ActiveRecord在新增物件时可传入Hash直接设定多项属性
  • 若没有限制可传入的参数会造成物件属性可被任意修改

    p1

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

  • Case

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

    p2

  • Rails 4后,Rails Core内建strong_parameters

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

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

0x02 Unsafe Query Generation


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

    p3

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

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

  • commit中可看到类似的检查

    p4

Code for Testing

p5

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

p6

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

p7

0x03 Content_tag


Rails提供content_tag方便产生HTML

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

    p8

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

    p9

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

    p10

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移除

    p11

  • 此次问题发生在XML解析

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

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

p12

p13

Ref: Rails 3.2

Proof

Rails 3.1: 成功执行指令

p14

难得一见的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

p15

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

    p16

    p17

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

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

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

0x06 Reference