![](/style/images/good.png)
![](/style/images/bad.png)
Rails Security (上) | WooYun知识库
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直接设定多项属性
若没有限制可传入的参数会造成物件属性可被任意修改
透过新增/修改送出的属性,可以变更任意物件属性
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
0x06 Reference
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK