Rails Security (上)
Lobsiinvok · 2016/03/09 10:20
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
- The Ruby/GitHub hack: translated
- How Does Rack Parse Query Params? With Parse_nested_query
- Cross Site Scripting (Content Tag)
- Bad coding style can lead to XSS in Ruby on Rails
- 分析下難得一見的ROR的RCE(CVE-2013-0156)
- Rails PoC exploit for CVE-2013-0333
- Dynamic Render Path
- Rails 動態樣板路徑的風險
總結
以上是生活随笔為你收集整理的Rails Security (上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu安装vmware 64位
- 下一篇: 只读域控制器在Server Core中的