0%

Ruby命令注入漏洞研究

漏洞摘要

前些天看到ruby又有命令注入漏洞,CVE-2021-31799,看了下原因比较简单,感慨这个漏洞我应该能提前发现,只要自己够仔细,然而呢,马大哈本性暴漏。
复现这个漏洞比较简单,在目录下写一个|$(whoami)-tags的文件,然后执行rdoc命令,就能触发whoami命令,如图:

漏洞分析

这个漏洞的原因不再分析了,ruby官方公告写的很清楚,调用kernel#open()函数导致的,ruby历史上也多次出现过类似命令注入问题,然而为什么这个函数能执行命令?还有哪些函数同样具有此类功能,需要我们继续探讨下。

为什么

查看ruby文档中对kernel#open函数的描述If path starts with a pipe character ("|"), a subprocess is created, connected to the caller by a pair of pipes.,看来是提供了一种类似popen的执行方式,所以他可以执行命令,使用方法参考Ruby文档:https://ruby-doc.org/core-3.0.1/Kernel.html#method-i-open

还有谁

搜索ruby源代码check_pipe_command函数,可以发现有两处调用了他,详细分析下,除了open函数外,还有6个ruby函数具有类似功能:

  • IO.binread
  • IO.binwrite
  • IO.read
  • IO.write
  • IO.readlines
  • IO.foreach

以后在审计ruby代码的时候记得审计这些函数,他们也可以执行命令。

除此之外,其他可以执行命令的ruby函数也顺便记录下:

  • system
  • exec
  • spawn
  • IO.popen
  • ``
  • Open3.popen2
  • Open3.popene
  • Open3.popen3
  • Open3.*

以上都是基于ruby 3.0.1,老版本可能有更多方法。