通过 VSCode 漏洞一键盗取 GitHub 令牌
仅仅通过点击一个链接,攻击者就可以窃取到一个 GitHub 令牌,该令牌可以读取和写入你的库,包括私有库。目录 背景 VSCode Webview 安全模型 漏洞 PoC 和自我保护 VSCode 的优点 完全披露时间线 背景 你知道 GitHub 有一个非常酷的功能叫做 github.dev 吗?在你有权限访问的任何仓库中,如果你将 URL 从 github.com 更改为 github.dev,或者点击这个小菜单项:你将被启动到一个完全在浏览器中运行的轻量版 VSCode 中(我想这是用电子技术编写你的应用程序的一个优势)。这个 VSCode 的浏览器实例非常强大,你可以查看仓库中的所有文件(即使是私有文件),你可以发送拉取请求,甚至进行提交。这个功能是通过 github.com 向 github.dev 发送一个 OAuth 令牌来实现的,该令牌允许它代表你与 GitHub 交互。这个令牌并没有限于你所交互的特定仓库,这意味着它对你可以访问的每个其他仓库都有完全访问权限。这个令牌的存在以及这个 Web 应用几乎运行了 VSCode 百万行 TypeScript 代码库的事实,使其成为任何寻找 VSCode 漏洞的人的极好目标。我们在这里将探讨这种漏洞,并展示攻击者如何利用它来外泄你的 GitHub 令牌。 VSCode Webview 安全模型 作为一个桌面电子应用程序,在 VSCode 中执行任意 JavaScript 相当于完全远程代码执行。这就是 VSCode 实施一些沙盒方法的原因,我们将在此重点关注 VSCode 的 webviews。Webviews 使用一个与主 VSCode 窗口不同来源的 <iframe>,以确保其中执行的任何 JavaScript 完全隔离。这些 webviews 被用于 Markdown 预览或编辑 Jupyter 笔记本等功能:单元的输出渲染到来自 vscode-webview://... 的 <iframe> 中,而不是具有 vscode-file://... 来源的主电子窗口。这意味着即使 Jupyter 笔记本使用内置的显示 HTML 或使用 JavaScript 进行交互式小部件的功能,实际的核心 VScode 应用程序也受到保护。无法在此 iframe 中使用 Electron 与 Node.js API 的集成或从该框架调用 VSCode 的 API。很好,这使我们能够渲染内容,但仅仅静态内容是无聊的。我们如何实现类似于让 Markdown 预览显示当前高亮的源行或在我们编辑时实时更新预览这样的功能?给予我们安全的相同跨源策略也阻止了我们的主编辑窗口与 vscode-webview://... 框中的 DOM 进行交互。毕竟,你不会想要使用 <iframe src="google.com"> 的人能够与谷歌页面进行交互,窃取你的 cookie 或更改该网站的行为。> document.getElementsByTagName('iframe')[0].contentWindow.findElementById('foo') 未捕获的安全错误:未能从 'Window' 阅读命名属性 'findElementById':阻止来自源 "vscode-file://vscode-app" 的框架访问跨源框架。允许这种行为的唯一方式是让两个不同来源的网页使用 Window.postMessage() API 进行协作。此方法允许在不同窗口之间发送 JavaScript 对象。因此,在显示哪个渲染的 Markdown 行对应于哪个编辑器行的示例中,主编辑窗口发送一个像这样的消息:{ type: " onDidChangeTextEditorSelection " , line: 31 } 然后在 webview 中运行的相应代码有一个侦听器来接收此消息并添加高亮:window.addEventListener('message', async event => { const data = event.data as ToWebviewMessage.Type; switch (data.type) { ... case 'onDidChangeTextEditorSelection': marker.onDidChangeTextEditorSelection(data.line, documentVersion); return; 注意:在浏览器中的 VSCode 使用类似的沙盒模型。VSCode 的开发者 Matt Bierner 有一篇关于从 Electron 移植过程中遇到的挑战的优秀博客文章,值得一看。 漏洞 因此,我们的 webviews 的安全边界大致如下:但在用户界面方面,我们的 webview 正好位于窗口的这里。人们期望点击链接、拖拽或按 Ctrl+F 等基本功能能够在它们内部工作:因此,VSCode 通过消息传递机制实现了一些基本功能以启用这些特性。说到键盘快捷键,精明的读者可能已经注意到与 <iframe> 相关的问题。如同大多数跨源内容,浏览器在这两个框架之间提供了良好的隔离。如果你有一个 hackerman.com 页面,并且你 iframe 了 google.com/login,你不会希望 hackerman 页面能够...
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡