Author: Lobsiinvok
Rails是Ruby廣泛應用方式之一,在Rails平臺上設計出一套獨特的MVC開發架構,采取模型(Model)、外觀(View)、控制器(Controller)分離的開發方式,不但減少了開發中的問題,更簡化了許多繁復的動作。
此篇講稿分為上下部份,因為最近在開發Rails,需要針對安全問題做把關,便借此機會針對歷史上Rails發生過的安全問題進行歸納與整理。
這篇講稿承蒙安全領域研究上的先進,在自行吸收轉??換后,如有筆誤或理解錯誤的地方還望各位見諒并糾正我,感謝 :D
快速跳轉
若沒有限制可傳入的參數會造成物件屬性可被任意修改
透過新增/修改送出的屬性,可以變更任意物件屬性
Rails 3.2.3后,config.active_record.whitelist_attributes = true
Rails 4后,Rails Core內建strong_parameters
更適當地將處理的過程鎖定在Controller layer
更有彈性地針對屬性作過濾
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中可看到類似的檢查
Rails 3.1.0: 成功繞過nil?的檢查
Rails 4.2.5: 被攔截,直接替換成nil
Rails提供content_tag方便產生HTML
Ref: brakeman
In latest rails 4.2.5, attr still can be injected with any html data.
盡管attr values??有escape,但跟button_to一起作用時卻……
html_safe
的字串,代表此字串在后續輸出時不再做escapehtml_safe
型的字串(等價于raw)在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
Rails 3.1: 成功執行指令
YAML.load
convert_json_to_yaml
Render是處理request的一連串過程
動態樣板間接變成LFI問題,搭配上面所述的default_template_handler
為ERB,只要找到有調用ruby code的樣板或是可自行寫入的檔案,就能夠造成RCE
真實環境下發生的問題可以前往DEVCORE查看
如果有類似開發環境應立即處理,default_template_handler
要到rails5才轉換成RAW
改以白名單的方式限制template名稱或是根據commit的內容手動Patch