安全研究员Ammar Askar近日披露了一个令人警醒的VSCode安全漏洞:攻击者只需要一个操作——让用户点击一条恶意链接——就能从VSCode的webview中窃取用户的GitHub访问令牌。这个漏洞的可怕之处在于它的攻击路径极其隐蔽,整个过程不需要用户任何额外交互,看起来就像正常使用一个Jupyter notebook。

这个漏洞的核心在于VSCode的webview机制与Jupyter notebook的深度集成。VSCode为了支持notebook功能,允许在webview中渲染任意HTML内容,并通过postMessage接口与外部通信。问题出在webview的键盘事件处理上:VSCode webview会转发某些键盘组合键到编辑器核心,其中就包括Ctrl+Shift+P——这个快捷键的作用是调出VSCode的命令面板。
攻击的精确步骤是这样的:首先,攻击者创建一个包含恶意JavaScript的Jupyter notebook,当用户在VSCode中打开这个notebook时,恶意脚本就开始运行。这个脚本通过监听webview的keydown事件,精确地检测用户何时按下Ctrl+Shift+P。一旦检测到,脚本就会模拟发送命令面板的打开指令,然后通过postMessage接口向VSCode发送一条精心构造的消息,指示VSCode安装一个来自攻击者控制的扩展。

这个扩展安装过程之所以能够实现,是因为VSCode在用户首次安装扩展时会弹出一个确认对话框,但攻击者找到了绕过方法——利用VSCode的"信任发布者"机制。如果用户之前曾经信任过某个发布者的扩展,VSCode会记住这个选择并自动放行来自同一发布者的扩展安装。攻击者正是利用了这个信任传递逻辑,让恶意扩展悄无声息地通过安装验证。
扩展安装成功后,攻击者就获得了对用户GitHub令牌的完全访问权限。这个令牌是从VSCode的GitHub集成中提取的,具有读写用户所有私有仓库的权限。这意味着攻击者可以读取源代码、植入后门、甚至以受害者身份推送恶意提交。

从技术层面看,这个漏洞揭示了现代IDE安全架构中的一个根本性矛盾:为了提供丰富的扩展性和功能集成,IDE必须在安全边界上做出妥协。VSCode的webview原本设计用来隔离不受信任的网页内容,但Jupyter notebook的集成需求迫使其放宽了这层隔离。这种"功能优先"的安全权衡,在其他开发工具中也普遍存在。
目前VSCode已发布了安全更新修复此问题,但这个漏洞的存在时间长度和影响范围仍然令人担忧——毕竟Jupyter notebook是数据科学家和机器学习工程师的日常工具,而这个群体往往拥有大量高价值的代码资产。对于开发者而言,主动更新VSCode、避免打开来源不明的notebook文件、以及定期审查已安装扩展的发布者信任状态,是降低风险的关键做法。
参考来源:https://blog.ammaraskar.com/github-token-stealing/