0x01关键词: Ruby on Rails 路径穿越任意文件读取 0x02背景: 近日,补天漏洞响应平台监测到网络上出现了Ruby on Rails的路径穿越与任意文件读取漏洞以及利用,通过此漏洞可导致服务器敏感信息泄露,可对公司资产进行窃取,严重危害信息安全。 补天漏洞平台对此次事件进行了技术分析,鉴于该漏洞可直接读取服务器任意文件,建议相关企业尽快进行安全评估。 0x03情报通告:
0x04威胁程度:个人风险评级:低危 企业风险评级:高危 情报风险预警:对公司影响等级为高,对基于Ruby on Rails框架的企业均有被攻击的风险。 0x05情报描述:操作视图(Action View)中存在文件内容泄露漏洞,特制的HTTP请求头与render file调用相结合可导致目标服务器上任意文件被读取,造成严重的信息安全威胁。 0x06漏洞测试过程:本文所用版本是vulnerable Rails (版本5.2.1)。 下载安装测试代码: 生成控制器: 在app/controllers/chybeta_controller.rb中添加: 在config/routes.rb中添加resources : 可以用命令rails routes检查是否存在路由。 构造HTTP头修改Accept头为../../../../../../../../etc/passwd{{ :完成复现 代码审计: 在控制器中通过render file形式来渲染应用之外的视图,因此在actionview-5.2.1/lib/action_view/renderer/template_renderer.rb:22中会根据options.key?(:file),调用find_file来寻找视图。 find_file代码: 继续跟入args_for_lookup函数,用于生成用于查找文件的参数,当其最终返回时会把payload保存在d 此后回到@view_paths.find_file并跟入会进入actionview-5.2.1/lib/action_view/path_set.rb: 由于要渲染的视图在应用之外,因此跟入find_all_anywhere: 跳过cached部分,跟入find_templates,这里正式根据条件来查找要渲染的模板: build_query后如下: 利用../与前缀组合造成路径穿越,利用最后的{{完成闭合,经过File.expand_path解析后组成的query如下: /etc/passwd{{},}{+{},}{.{raw,erb,html,builder,ruby,coffee,jbuilder},} 最后/etc/passwd被当成模板文件进行渲染,最后造成了任意文件读取。 0x07影响面企业使用6.0.0.beta3及以前的全部版本均受到此漏洞影响。
0x08相关漏洞CVE-2019-5418 | |||||||||||||||||||||
受影响产品及版本: | |||||||||||||||||||||
6.0.0.beta3及以前的全部版本都受影响 6.0.0.beta3 | |||||||||||||||||||||
解决方案: | |||||||||||||||||||||
0x09总结以及处置建议处置建议: 目前Ruby on Rails官方已发出修复补丁,企业可通过下载补丁进行文件替换操作封堵漏洞。补丁链接: https://groups.google.com/forum/#!topic/rubyonrails-security/pFRKI96Sm8Q
参考资料: https://github.com/rails/rails/commit/f4c70c2222180b8d9d924f00af0c7fd632e26715 https://github.com/mpgn/CVE-2019-5418 0x10附录个人风险等级与威胁系数
企业风险等级与威胁系数
| |||||||||||||||||||||