..

CVE-2017-17405 Ruby Command injection

Ruby 是一种面向对象、命令式、函数式、动态的通用编程语言。在20世纪90年代中期由日本计算机科学家松本行弘(Matz)设计并开发。 - Ruby - 维基百科,自由的百科全书

编程语言里出现rce漏洞真的太少见了,CVE-2017-17405 是Ruby中Net::FTP 使用open() 并且localfile可控所导致的rce

Ruby 在 GitHub 中到项目在14号提交了fix Fix a command injection vulnerability in Net::FTP. · ruby/ruby@6d3f72e,可以看到几处原本使用open()现在改为了File.open(),之前没有接触过Ruby,奇怪为什么open()竟有执行命令的能力?

怀着这种问题打算找Ruby文档看看open()到底是什么鬼?然后我找到了这个 Module: Kernel (Ruby 2.3.0)

详细介绍了CVE-2017-17405的成因,其实很简单,open()可以作为打开文件使用,但是,敲黑板! 在文件名可控到时候则不安全,因为如果文件名以’|‘开头时,其后的字符串会被当作命令来执行,而且文件名为"|-“的话,open将生成Ruby的子进程,并返回与子进程之间的管道(pipe)(IO对象)。(此时的运作与IO.popen相同。)

简直可怕,这个"特性"简直是Python程序员写Ruby时最最需要注意的地方之一呀。(perl也有这样的“特性”)

本地试试"威力”

可能有人会说,“这也是正常功能呀,官方文档也有提及,自己不仔细看文档怪谁”

的确,编程语言可以说时开发者不仔细看文档,开发者说文档内容太多大部分程序员都是当作字典用到到时候查一查,那总得有人为漏洞买单吧。

lib/net/ftp.rb,官方也是使用了错误了函数,可见官方开发者也没有仔细看文档呀,233

ref: https://www.ruby-lang.org/en/news/2017/12/14/net-ftp-command-injection-cve-2017-17405/ http://ruby-doc.org/core-2.3.0/Kernel.html#method-i-open