0x01关键词:
Ruby on Rails 路径穿越 任意文件读取
0x02背景:
近日,补天漏洞响应平台监测到网络上出现了Ruby on Rails的路径穿越与任意文件读取漏洞以及利用,通过此漏洞可导致服务器敏感信息泄露,可对公司资产进行窃取,严重危害信息安全。
补天漏洞平台对此次事件进行了技术分析,鉴于该漏洞可直接读取服务器任意文件,建议相关企业尽快进行安全评估。
0x03情报通告:
发现时间 |
2019年03月16日 |
威胁目标 |
采用Ruby on Rails框架进行开发的企业 |
主要风险 |
敏感信息造成威胁 |
攻击入口 |
操作视图处 |
使用漏洞 |
CVE-2019-5418 |
受影响应用 |
6.0.0.beta3及以前的全部版本都受影响 |
已知影响 |
导致服务器信息泄露 |
威胁程度 |
高 |
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保存在details[formats]中:

此后回到@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://chybeta.github.io/2019/03/16/Analysis-for%E3%80%90CVE-2019-5418%E3%80%91File-Content-Disclosure-on-Rails/
https://github.com/rails/rails/commit/f4c70c2222180b8d9d924f00af0c7fd632e26715
https://github.com/mpgn/CVE-2019-5418