VSCode漏洞:点击链接即可窃取GitHub Token

VSCode 漏洞:点击一个链接就可能被盗走 GitHub Token

安全研究者 Ammar Askar 于 6 月 2 日披露了一个影响 VSCode(包括 github.dev 网页版和桌面版)的安全漏洞。攻击者只需诱导用户点击一个恶意链接,就能窃取其 GitHub OAuth Token,进而访问用户有权限的所有仓库——包括私有仓库。

github.dev 编辑界面

漏洞原理

漏洞的核心在于 VSCode 的 Webview 键盘事件转发机制

VSCode 使用 iframe 隔离不受信任的内容(如 Markdown 预览、Jupyter Notebook),但为了让用户在 Webview 内也能使用快捷键,VSCode 注册了一个 did-keydown 事件监听器,将 Webview 内的所有键盘事件通过 postMessage 转发给主窗口。

问题在于:Webview 中的恶意脚本可以伪造键盘事件。由于事件处理没有验证来源,伪造的按键事件会被主窗口当作真实用户输入处理。

攻击链

完整的攻击链如下:

  1. 诱导点击:用户点击一个指向 github.dev 的恶意链接(内含一个 Jupyter Notebook,Notebook 中嵌入了恶意 JavaScript)
  2. 等待 VSCode 推荐扩展通知:VSCode 自动弹出"是否安装推荐扩展"的通知
  3. 伪造快捷键接受通知:恶意脚本发送 Ctrl+Shift+A 键盘事件,自动点击"安装"
  4. 安装本地恶意扩展:攻击者在 .vscode/extensions/ 目录预置了一个扩展,注册了自定义快捷键 Ctrl+F1,绑定到 workbench.extensions.installExtension 并跳过发布者信任检查
  5. 触发扩展安装:脚本发送 Ctrl+F1,从 Marketplace 安装攻击者指定的扩展
  6. 窃取 Token:安装的扩展读取 GitHub OAuth Token,调用 api.github.com/user/repos 获取用户的私有仓库列表

整个过程无需用户任何额外操作,只需初始的一次点击。

影响范围

  • github.dev(网页版):最高危。只要用户曾经使用过 github.dev 且未清除浏览器 localStorage,任何网页链接都可以将用户重定向到攻击页面,且 github.dev 没有 CSRF Token 保护
  • VSCode 桌面版:同样存在,但利用门槛更高——需要用户克隆攻击者的仓库并在桌面版中打开含恶意脚本的 Notebook。一旦成功利用,由于 VSCode 扩展可以调用 Node.js API(包括 child_process),等同于远程代码执行

关键风险点

  • GitHub 传给 github.dev 的 OAuth Token 不限于当前仓库,而是拥有用户所有仓库的完整权限
  • github.dev 没有 CSRF Token,任何外部链接都可以直接将用户带入攻击
  • 桌面版如果被利用,后果更严重——不仅是 Token 泄露,而是完整的 RCE

防护建议

  • 清除 github.dev 站点数据:在浏览器设置中删除 github.dev 的 localStorage 和 cookies。清除后,再次访问 github.dev 会重新弹出权限确认对话框
  • 检查已安装扩展:如果怀疑曾访问过 PoC 页面,检查并卸载可疑扩展
  • 关注补丁更新:该漏洞于 6 月 2 日通过完全披露(full disclosure)方式公开,研究者称此前曾联系 GitHub 安全团队但选择了公开披露

值得注意的是,这是在 5 月 20 日 GitHub 披露 VSCode Marketplace 恶意扩展窃取约 3,800 个私有仓库事件之后的又一个 VSCode 安全问题,开发者工具供应链安全值得持续关注。

来源:Ammar's Blog · CyberSecurityNews · SecurityOnline

相关推荐