你正读着一篇技术文章,里边贴心地放了一个“在线预览代码”的链接。手指一动,点开,页面便切进一个浏览器里的代码编辑器——真方便。你随意扫了两眼,关掉标签页,前后不过几秒。可就在这几秒里,某个躲在暗处的攻击者,已经悄悄拿到了一个权限极高的访问令牌。不只是当前这个开源仓库,你名下所有的私有仓库,统统能被读、被改。
这不是段子。最近有安全研究者完整公开了一条攻击链:一个链接,一次点击,就能让你的代码仓库彻底“裸奔”。而整件事的核心道具,恰是某个你天天见到、却未必细想过的一键式“网页版编辑器”。
这项功能其实很简单:把仓库网址里的“.com”换成“.dev”,或者在界面上点一下那个小小的菜单项,一个轻量级的网页版VS Code就会出现在浏览器里。它远不止“看看而已”——你能浏览仓库里的每一个文件(哪怕是私有的),能发起Pull Request,甚至直接提交改动。
这背后靠的是一把“钥匙”。每次你从主站跳进这个编辑器页面时,主站会默默向它递送一个OAuth令牌。戴上这把钥匙,编辑器就能光明正大地以你的身份,与代码托管平台的接口交互。
更要命的是,这个令牌的权限根本不限于你当前盯着的那个仓库。只要是你名下所有有访问权限的仓库——无论是公司的私有代码库,还是你死死藏着的个人项目——它都能一把抓完。没错,是所有,不是仅限当前这一个。
一个拥有如此全局权限的令牌,就躺在完全在浏览器里运行的Web应用里。而这个应用,又是从VS Code那庞大的TypeScript代码库碾过来的。对寻找漏洞的人来说,这简直是一座灯火通明的宝库。
要想弄清点击链接是怎么把令牌偷走的,得先看看VS Code为安全筑起的隔离墙。桌面版VS Code本质上是个Electron应用,一旦塞入任意JavaScript并执行,几乎就等于远程代码执行。因此,它设计了一套沙箱方案,核心之一就是“webview”。
webview的原理很直白:用一个把可能运行恶意脚本的部分,圈在完全不同的“源”里。主编辑器窗口跑在vscode-file://源,而Markdown预览、笔记本输出这些内容,则丢进vscode-webview://源的iframe中。两个源被浏览器的同源策略牢牢按住:iframe里的脚本,碰不到Node.js API,也摸不着编辑器核心功能;反过来,主窗口也无法直接戳进iframe的文档结构。这种“老死不相往来”的设计,足以让很多利用恶意HTML或JavaScript的企图碰一鼻子灰。
然而,光有绝对隔离是不够的。功能上需要Markdown预览和编辑器打出“配合战”——预览得知道光标正停在源代码的哪一行,还得在源码改动时实时刷新。这些信息如果跨不过同源限制,可用与安全就站在了跷跷板的两头。
于是,VS Code搭建了一套精心设计的通信渠道,让主窗口和webview之间能有序地“传纸条”。具体接口细节是严格防守的地带,但它的存在本身就意味着,那道看似天衣无缝的隔离墙上,开了一扇必须存在、必须随时待命的门。任何一扇这样的门,都可能成为攻击者死命撬动的那块砖。
正是在这种“隔离必须严丝合缝,通信又必须实时高效”的矛盾下,一条点击劫持令牌的攻击链浮出了水面。攻击者不需要攻破你本机软件,也不需要你安装任何插件,只需精心构造一个链接,诱使你从主站跳转到某个恶意页面。
这个页面会巧妙利用webview与主窗口之间的消息通道,结合某些逻辑疏漏,将那个拿着所有仓库权限的令牌,神不知鬼不觉地外传给攻击者的服务器。整个过程你毫不知情,直到私库被翻了个底朝天。
怎么保护自己?首先,不要随便点击任何声称可以“预览代码”的不明链接。如果你真的需要在线查看,可以手动修改网址,或在确保安全环境下操作。其次,定期审查你OAuth令牌的作用范围,如果可能,避免使用全局权限的令牌。最后,保持对这类新型攻击手段的关注,安全意识永远是第一道防线。
值得肯定的是,VS Code团队在得知相关漏洞报告后,响应迅速,已部署了修复措施,并一直在强化webview的隔离与通信安全模型。研究者出于完全披露的原则,在补丁上线后才公开细节,也给足了修复窗口。
一次点击,或许就打开了一扇通往全部私有代码的大门。对于每天与仓库打交道的你,这绝不是危言耸听。
热门跟贴