丰色 发自 凹非寺
量子位 报道 | 公众号 QbitAI

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

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

如果被滥用,攻击者可以在使用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"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.rburl "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小时之内完成了主要修复,并发布了通报。

“这不是单方面的责任”

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

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

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

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

此漏洞没有单一负责方。

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

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

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

参考链接:
[1]https://blog.ryotak.me/post/homebrew-security-incident-en/
[2]https://news.ycombinator.com/item?id=26922448
[3]https://brew.sh/2021/04/21/security-incident-disclosure/
[4]https://wangzhan.360.cn/774.html
[5]https://github.blog/2021-04-22-github-actions-update-helping-maintainers-combat-bad-actors/

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

  1. Ubuntu+Win+Arm远程操纵电脑方案

    1.正常的x86架构 在win系统下使用向日葵和Teamviewer都可以 在ubuntu系统下使用向日葵远控,刚开始会出现一连接就断开的现象,因为桌面显示管理器不兼容导致的远程界面分享问题. 下载一 ...

  2. 从入门到入土:恶意代码Lab03-03.exe|分析实验|运行截图|问题回答|

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  3. 详述Visual Studio 代码远程开发扩展中的远程命令执行漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 Visual Studio 代码远程开发扩展(Code Remote Development Extension) 1.50 未能在将其用作 s ...

  4. Windows漏洞:MS08-067远程代码执行漏洞复现及深度防御

    摘要:详细讲解MS08-067远程代码执行漏洞(CVE-2008-4250)及防御过程 本文分享自华为云社区<Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御>,作者 ...

  5. 堪比“震网”:罗克韦尔PLC严重漏洞可导致攻击者在系统中植入恶意代码

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 罗克韦尔自动化公司的可编程逻辑控制器 (PLCs) 和工程工作站软件中存在两个新的安全漏洞(CVE-2022-1161 和 CVE-2022-1 ...

  6. phpcms2008网站漏洞如何修复 远程代码写入缓存漏洞利用

    SINE安全公司在对phpcms2008网站代码进行安全检测与审计的时候发现该phpcms存在远程代码写入缓存文件的一个SQL注入漏洞,该phpcms漏洞危害较大,可以导致网站被黑,以及服务器遭受黑客 ...

  7. Edge 的 0day 漏洞:可远程执行代码;苹果手机被曝砍单,富士康或被迫裁员

    (给技术最前线加星标,每天看技术热点) 转自:开源中国.solidot.cnBeta.腾讯科技.快科技等 [技术资讯] 0.安全专家发现 Edge 的 0day 漏洞:可远程执行代码 安全研究专家 Y ...

  8. VMware Mac版本漏洞可任意执行恶意代码

    日前安全研究人员发现了一个存在于虚拟化软件VMware Mac版本Fusion中的严重安全漏洞,该漏洞可以通过Windows虚拟机在Mac主机上执行恶意代码,VMware已经发布了Fusion 2.0 ...

  9. wordpress漏洞_用软件工具扫描WordPress / Shopify主题恶意代码以及漏洞分析相关工具...

    Shopify的主题模板相对于其他WordPress市场的主题,价格偏高,很多卖家选择免费的去授权或者卖家使用后下载后的主题,那么这么就会有不法恶意人士向代码里面加入恶意代码或者制造一些主题漏洞后面, ...

最新文章

  1. 使用神经网络做二分类,输出层需要几个神经元?应该选择哪一种激活函数?如果要处理minst数据、输出层需要几个神经元?使用那种激活函数?如果使用神经网络预测房价,输出层需要几个神经元、使用什么激活函数?
  2. 将ArrayList保存到SharedPreferences
  3. php面向对象封装mysql_php mysqli面向对象封装mysql数据库常用操作
  4. AngularJS学习笔记一:简单入门
  5. 函数创建对象(2)原型模式
  6. 装逼的翻译,害死多少人,你同意吗?到底什么是非终止状态,终止状态
  7. springboot 获取bean_3W 字的 Spring Boot 超详细总结
  8. 500能不能配个玩英雄联盟的电脑?
  9. 敏捷开发一千零一问系列之十七:长期受制于强势客户怎么办?(上)
  10. Android - 硬件抽象层(HAL)
  11. 【语音评价】基于matlab语音质量客观评价(PESQ)【含Matlab源码 1717期】
  12. MyCat之全局表和ER表
  13. Ubuntu安装jdk8
  14. 配置Jenkins及下载相关插件
  15. 实现spring+mybatis+uncode dal,应用自动切换连接数据库
  16. [统计学笔记] 方差分析表的解读
  17. LINUX编译xcb/xcb-proto
  18. 拿它们练Python爬虫,是在法律边缘试探吗?爬虫圈香饽饽之视频网站的评论区采集
  19. 如何让tomcat告别频繁重启
  20. 8、iOS strip 与 dead strip

热门文章

  1. 什么是Scala的收益?
  2. __add__,关于运算符重载(用户权限)
  3. 关于“大数据”的15条干货思考
  4. Pgcli—自动完成和语法高亮的Postgres命令行工具
  5. FATAL ERROR: Could not find ./bin/my_print_defaults
  6. [转]重新签名APK文件
  7. Why to do,What to do,Where to do 与 Lambda表达式!
  8. java Scanner具有神奇的作用可惜大部分java开发人员不知
  9. 配置gradle时,一直报错提示:ERROR: JAVA_HOME is set to an invalid directory: D:\Java\jdk1.8.0_144;
  10. Xamarin Android教程Android基本知识版本介绍与系统介绍