Rails是Ruby广泛应用方式之一,在Rails平台上设计出一套独特的MVC开发架构,采取模型(Model)、外观(View)、控制器(Controller)分离的开发方式,不但减少了开发中的问题,更简化了许多繁复的动作。
此篇讲稿分为上下部份,因为最近在开发Rails,需要针对安全问题做把关,便借此机会针对历史上Rails发生过的安全问题进行归纳与整理。
这篇讲稿承蒙安全领域研究上的先进,在自行吸收转 换后,如有笔误或理解错误的地方还望各位见谅并纠正我,感谢 :D
若没有限制可传入的参数会造成物件属性可被任意修改
透过新增/修改送出的属性,可以变更任意物件属性
Case
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中可看到类似的检查
Ref: brakeman
In latest rails 4.2.5, attr still can be injected with any html data.
尽管attr values 有escape,但跟button_to一起作用时却……
html_safe
的字串,代表此字串在后续输出时不再做escape html_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
YAML.load
convert_json_to_yaml
Rails 3.0.20
动态样板间接变成LFI问题,搭配上面所述的 default_template_handler
为ERB,只要找到有调用ruby code的样板或是可自行写入的档案,就能够造成RCE
真实环境下发生的问题可以前往 DEVCORE 查看
如果有类似开发环境应立即处理, default_template_handler
要到rails5才转换成RAW
改以白名单的方式限制template名称或是根据commit的内容手动Patch