9

Rails Security (上) | WooYun知识库

 6 years ago
source link:
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Rails Security (上)

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



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK