Author: Lobsiinvok
0x00 前言
Rails是Ruby广泛应用方式之一,在Rails平台上设计出一套独特的MVC开发架构,采取模型(Model)、外观(View)、控制器(Controller)分离的开发方式,不但减少了开发中的问题,更简化了许多繁复的动作。
此篇讲稿分为上下部份,因为最近在开发Rails,需要针对安全问题做把关,便借此机会针对历史上Rails发生过的安全问题进行归纳与整理。
这篇讲稿承蒙安全领域研究上的先进,在自行吸收转换后,如有笔误或理解错误的地方还望各位见谅并纠正我,感谢
快速跳转
0x01 Mass assignment
- 让Rails developers爱上的毒药(toxic)
- ActiveRecord在新增物件时可传入Hash直接设定多项属性
-
若没有限制可传入的参数会造成物件属性可被任意修改
-
透过新增/修改送出的属性,可以变更任意物件属性
-
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
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