一群来自德克萨斯大学奥斯汀分校、斯坦福大学、Mozilla、谷歌和加州大学圣地亚哥分校的研究人员,干了件相当“硬核”的事。他们直接把Firefox浏览器的JavaScript引擎——SpiderMonkey——从浏览器主体里“扯”了出来,然后给它单独造了一间只属于自己的安全沙盒。这个项目叫Mohabi,目标听起来既直接又奢侈:让JS引擎无论在里头怎么折腾、出了多离谱的Bug,都别想影响浏览器分毫。

这个想法背后是一个老生常谈的痛:浏览器几乎每天都要运行大量来源不明、甚至可能刻意构造的JavaScript代码,而JS引擎自身的漏洞,很容易变成攻击者直捣黄龙的通道。过去大家往往选择事后打补丁,但Mohabi团队换了种思路——干脆不给攻击机会,直接在架构层面把引擎“关”起来。这样一来,即便引擎内部被撕开口子,浏览器其他部分也能安然无恙。

要把这么个紧密耦合的系统拆开,难度不亚于给一辆飞驰的跑车换引擎。SpiderMonkey与Firefox之间有成千上万个函数在共享数据结构,控制流盘根错节。研究团队没有选择蛮力手工改造,而是聪明地借助了类型系统和自动化代码生成技术。他们设计了一套方法,让这个跨越数万处代码、牵动无数依赖关系的“外科手术”,变成了一件在合理工程投入内能够安全完成的任务。

丢进沙盒之后,真正的考验才刚刚开始。普通的软件故障隔离(SFI)技术,是把被隔离的模块圈定在一个受限的内存空间内,靠编译器自动插入边界检查等“守门”指令来防止越界。但JS引擎太特殊了——它天然需要一个巨大的内存舞台,而且访问模式十分狂野。于是团队特地打磨了一套经优化的SFI工具链,专门应付这种大内存、高动态的隔离需求,确保既锁得住,又不至于让引擎跑得像在泥潭里游泳。

代价当然有,但远没到让人皱眉的程度。在常见的浏览器性能基准测试中,Mohabi引入的开销相当克制:JetStream 基准下性能损失仅为24.82%,而Speedometer上也只多出了24.43%的负担。更让他们有底气的是,这套针对x86-64平台开发的SFI工具链本身,在权威的SPEC 2017测试集中带来的额外开销只有5.9%到6.6%。研究人员直言,这已经是目前最快的x86-64 SFI工具链。

值得注意的是,Mohabi并不是一个纸上谈兵的原型。评审者们把它定义为迄今为止规模最大、也最具野心的“进程内沙盒化改造”案例。把一套代码规模庞大、常年未考虑过这种隔离设计的成熟系统,硬生生改出安全的现代化架构,并且让性能代价温和到可以接受,这件事本身就示范了软件故障隔离在复杂真实系统里的落地可能。对于无数正为老旧代码安全焦虑的程序员来说,这不只是一个学术实验,更像一张实在的技术路线图。