漏洞摘要
前些天看到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,老版本可能有更多方法。