Homebrew存在大漏洞,恶意代码远程操纵电脑

新闻 漏洞
在Homebrew/homebrew-cask仓库中,通过混淆Homebrew项目中自动拉取请求审阅脚本中使用的库,可以合并恶意的拉取请求。

 

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。

Mac包管理工具Homebrew出现了一个大漏洞:

在Homebrew/homebrew-cask仓库中,通过混淆Homebrew项目中自动拉取请求审阅脚本中使用的库,可以合并恶意的拉取请求

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

[[405521]]

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

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

Homebrew存在大漏洞,恶意代码远程操纵电脑

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

diff检查逻辑存在缺陷

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

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

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

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

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

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

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

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

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

  1. ++ "b/#{私藏代码写这儿}" 
  2. ++ b/Casks/cask.rb 

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

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

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

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

[[405522]]

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

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

以下是具体代码:

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

  1. ++ "b/#{puts 'Going to report it - RyotaK (https://hackeorne.com/ryotak)';b = 1;Casks = 1;iterm2 = {};iterm2.define_singleton_method(:rb) do 1 end}" 
  2. ++ 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" 
  •    end 
  • +++ "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 
  •    url "https://iterm2.com/downloads/stable/iTerm2-#{version.dots_to_underscores}.zip" 
  •    name "iTerm2" 
  •    desc "Terminal emulator as alternative to Apple's Terminal app 

如前面所述,git_diff将匹配的行 +++ “?b/(.*) 视为文件路径信息,而非添加的行,因此,此差异将被视为进行0行更改的请求

由于既不能修改未经授权使用的cask,也没有在homebrew-cask仓库中找到一个测试cask,小哥给Homebrew发邮件求助,按照工作人员的意思添加“打印日志”这一无害修改来验证了这个漏洞。

当其他用户执行brew search/brew cleanup等命令时即使没有安装目标cask,也将执行恶意代码。

官方在3小时之内完成了主要修复,并发布了通报。

Homebrew存在大漏洞,恶意代码远程操纵电脑

“这不是单方面的责任”

针对这次大漏洞,网友们议论纷纷,有人表示:

如果不是使用ruby解析git_diff,而是使用libgit,这个漏洞就不会发生。

如果Apple提供了一个功能更强大的软件包管理器,这不会发生。

如果数以百万计的Homebrew用户给了他们建造如此庞大的项目所需资金的一小部分,这也不会发生。

此漏洞没有单一负责方。

Homebrew存在大漏洞,恶意代码远程操纵电脑

另外,细心的朋友可能还记得,我们此前曾报道了一篇关于黑客用GitHub服务器挖矿的新闻,里面的黑客也是只需提交Pull Request,即使项目管理者没有批准,恶意挖矿代码依然能够执行。

和这次这个漏洞一样,都是抓住了GitHub Actions的自动执行工作流功能来“钻空”。

针对滥用Actions的问题,GitHub近日也更新了帮助保护维护者的新功能,比如在任何Actions工作流运行之前,来自首次贡献者的Pull Request将需要**具有写访问权限的仓库协作者的手动批准**。

 

责任编辑:张燕妮 来源: 量子位
相关推荐

2023-02-14 07:19:31

2011-08-09 11:45:45

2013-11-08 10:42:09

代码工具

2013-11-05 15:06:29

scdbg恶意代码分析安全工具

2021-05-10 09:52:37

漏洞恶意代码网络攻击

2014-10-23 09:40:57

2014-02-11 09:15:33

2016-11-24 11:07:54

Andriod恶意代码

2014-10-29 14:43:05

2013-07-18 10:06:54

2014-10-23 18:26:02

破壳漏洞Shellshock远程代码执行漏洞

2014-12-12 14:55:42

移动恶意代码移动安全

2014-09-12 17:47:36

2011-08-09 11:51:37

2018-08-10 04:40:56

2017-05-04 09:30:29

2017-03-27 15:46:14

2021-03-01 11:33:03

微软恶意代码恶意软件

2021-11-17 10:40:33

网络安全恶意代码网络攻击

2013-07-27 21:04:58

点赞
收藏

51CTO技术栈公众号