设为书签 Ctrl+D将本页面保存为书签,全面了解最新资讯,方便快捷。 您也可下载桌面快捷方式。点击下载 | 新浪科技 | 新浪首页 | 新浪导航

Homebrew存在大漏洞,恶意代码远程操纵电脑! 网友:这不是单方面的责任

2021-06-14 14:20:36    创事记 微博 作者:   

来源:量子位

如果被滥用,攻击者可以在使用brew的计算机上执行任意Ruby代码!

该漏洞的威胁登记在国内被360CERT评为10分严重。

漏洞的发现者是一位来自日本的后端程序员。

当天下午,他“闲来无事”逛起了HackerOne(漏洞赏金平台)。顺便看看经常使用的Homebrew有没有什么漏洞。

diff检查逻辑存在缺陷

由于Homebrew项目使用GitHub Actions运行CI脚本,小哥查看了.git-hub/workflows/下每个仓库的目录。

其中两个目录:一个负责检查用户提交的拉取请求的内容,进行批准,另一个目录负责自动合并这些被批准的代码。

拉取请求的内容被fetch后会被改为diff文件,并使用git_diff对其进行解析。

小哥一开始检查了可以通过批准请求的几个条件,没有发现问题。

但是直觉作怪,他还是掉过头去二次研究了git_diff仓库。

当看到其中报告了一个“更改行数引发解析错误”的问题时,小哥“灵机一动”:

我是不是能以某种方式对拉取请求进行伪装来满足批准条件,骗过git_diff?

于是他分析了git_diff解析diff文件的步骤,乍一看没毛病,但是细看其中一步发现了“猫腻”:可以多次更改源/目标文件路径信息。

于是通过下面这两行代码:

++ "b/#{私藏代码写这儿}"

++ b/Casks/cask.rb

第一行将私藏代码以上面的格式嵌入拉取请求,就可以被视为文件路径信息,而非代码变动。

第二行为更改文件路径的必需条件。

这样就可以绕过必需条件,将含有恶意代码的拉取请求视为零行更改的

“无害”请求,最终骗过diff,获得批准,完成自动合并!开始搞事情!

添加“打印日志”操作来验证此漏洞

“今天的收获可不菲”,小哥立即行动,提交了一个PR,通过Homebrew搞起了破坏,在HackerOne上对此漏洞进行PoC演示。

以下是具体代码:

(选取在GitHub上无意发布了一个API令牌的拉取请求iterm2.rb 进行更改 )

++ "b/#{puts 'Going to report it - RyotaK (https://hackeorne.com/ryotak)';b = 1;Casks = 1;iterm2 = {};iterm2.define_singleton_method(:rb) do 1 end}"

++ b/Casks/iterm2.rb

在第一行定义b,Casks,iterm2,iterm2.rb四个变量,才不会在第二行引发未定义错误,这样就可以作为有效的Ruby脚本执行。

通过添加这两行更改,GitHub返回以下差异:

diff --git a/Casks/iterm2.rb b/Casks/iterm2.rb

index 3c376126bb1cf9..ba6f4299c1824e 100644

--- a/Casks/iterm2.rb

+++ b/Casks/iterm2.rb

@@ -8,6 +8,8 @@

     sha256 "e7403dcc5b08956a1483b5defea3b75fb81c3de4345da6000e3ad4a6188b47df"

(声明:本文仅代表作者观点,不代表新浪网立场。)

分享到:
保存   |   打印   |   关闭