为了使Edge更安全,微软漏洞研究小组已经开始试验禁用即时(JIT)编译在浏览器的V8 JavaScript引擎,创建它的呼唤超级Duper安全模式

这个实验背后的理由听起来很有道理。在V8发布的cve中,略低于一半的cve与JIT编译器有关,而超过一半的Chrome滥用了JIT bug。(Edge的现代版本是基于与谷歌的Chrome浏览器相同的Chromium代码,所以Chrome的利用也会影响Edge。)微软很想知道,处理这样一个有问题的子系统的最简单的方法是不是只是禁用它,看看它会把它们带到哪里。

禁用JIT编译价格为代价:速度。JIT编译是一个性能功能,加速JavaScript的执行,是Web上使用的最受欢迎的编程语言。因为它坐在这么多的Web应用程序后面,所以JavaScript运行的速度直接影响了快速和响应的Web应用程序。

我们很好奇它会产生多大的影响。

什么是JIT编译?

对JIT汇编的良好定义是这一个

即时编译是一种执行计算机代码的方法,它涉及在程序执行期间(在运行时)而不是在程序执行之前进行编译。

使用JIT编译的原因很简单:速度。JIT编译结合了编译代码的速度和解释的灵活性。它允许生成更优化的代码。为了限制开销,许多JIT编译器只编译经常使用的代码路径。

V8是谷歌的开源高性能JavaScript和WebAssembly引擎,用c++编写。它在Chrome和Node.js中使用。因为Edge是基于Chromium的,所以它也使用V8。

禁用Edge的JIT编译器对速度的影响

我们运行了几个快速测试,看看禁用JIT的影响会有多大。为了运行这些测试,我们比较了Edge的最新官方版本(版本92.0.902.67)和最新可用的Microsoft Edge Beta版本(版本93.0.961.11),并启用和禁用了Super Duper安全模式。我们发现在最新的官方版本和beta版本之间的速度差异很小,所以我们把它们排除在结果之外。

测试是在一个慢速连接的VM中进行的。作为我们使用的基准Sunspider 1.0.2.我们想尝试更复杂的JetStream2,但由于某种原因,这句话没能坚持到最后。(如果你让它与JetStream2一起工作,我们很乐意听到你的消息。)

Sunspider称其基准测试集中于“开发人员今天用JavaScript解决的实际问题”,“在[JavaScript]语言的不同领域之间进行平衡”,并多次运行每个测试,以确定95%的置信区间,以及是否有统计上显著的结果。

测试 SDSM使中 SDSM残疾中 加速
3 d 76.7 ms + / - 3.4% 59.2 ms + / - 3.6% 1.3倍
访问 102.0ms +/- 0.8% 33.7 ms + / - 4.1% 3.03倍
Bitops. 98.4 ms + / - 1.0% 17.1 ms + / - 3.7% 5.75倍
控制流 9.1ms +/- 2.5% 5.6 ms + / - 6.6% 1.63倍
加密 46.0 ms + / - 1.5% 37.9 ms + / - 8.1% 1.21倍
日期 23.6 ms + / - 1.6% 26.9 ms + / - 2.0% 1.14倍
数学 61.4 ms + / - 1.5% 28.6 ms + / - 2.4% 2.15x.
正则表达式 36.0 ms + / - 2.1% 5.6 ms + / - 6.6% 6.43倍
字符串 70.1 ms + / - 2.2% 63.2 ms + / - 2.1% 1.109倍
全部的 523.3 ms + / - 0.6% 277.8 ms + / - 1.9% 1.88倍
SunSpider 1.0.2 JavaScript Benchmark Results comparison Microsoft Edge Beta (Version 93.0.961.11) with Super Duper Secure Mode enabled and disabled。所有结果均具有统计学意义。

我们的结果表明,启用JIT可以将JavaScript在Edge中的执行速度提高1.88倍。因此禁用JIT编译使Edge的JavaScript处理更加安全,但是几乎慢了一倍

在你们开始之前,我想说几句话:

  • 基准测试仅测试核心JavaScript语言,并且更多的事情会影响Web的速度而不是JavaScript执行。所以这并不意味着正常冲浪将是慢的两倍!
  • 我多次重复测试,虽然差异存在一些差异,但每次都有大致相同。(启用JIT编译时,在1.87倍和1.90x之间变化之间的结果变化。)

微软声称,他们发现使用超级Duper安全模式的用户在日常浏览中很少注意到有什么不同。这可能取决于你访问的网站的类型,你在同一时间做了什么,等等,但值得注意的是,衡量网络性能的工具,包括谷歌核心Web命脉因为慢速的JavaScript可以对用户体验产生如此深远的影响。

不能没有替代品

无论如何,历史教导我们只能禁用V8 JIT编译器不会成为一个长期解决方案。如果他们抱怨缓慢的浏览体验,那么任何人都会在计算机论坛上发出声音,就像“启用JIT”一样。我们认为我们可以根据类似的经验,以良好的信心预测这一点杀毒软件

普通民众不会为了安全而牺牲速度。因此,微软最终将不得不为人们提供另一种选择。有什么替代方案?它可以决定修复V8,并解决V8 bug的根本原因。如果它完全转向另一个JavaScript引擎,它可能有四个选择:Chakra或ChakraCore,这是微软为Edge Legacy网络浏览器开发的免费开源JavaScript引擎;Duktape;要么Moddable

还有更多的,但现实地说,对于微软来说,适应或采用这些引擎中的任何一个将意味着从Chromium转向,它最近才转向铬。它似乎不太可能立即创建一个“硬分叉”。目前,Super Duper安全模式实验的目标是提高攻击者的门槛。

JIT汇编的安全问题

正如我们前面提到的,在Edge中禁用JIT编译会减少攻击者拥有的选项(称为减少攻击表面).但是JIT编译的另一个问题是它与一些缓解技术不兼容。微软漏洞研究小组提到了一些在启用JIT时不能使用的安全特性:

  • 控制流动实施技术(CET)从英特尔的基于硬件的利用缓解。英特尔一直在积极与Microsoft和其他行业合作伙伴合作,通过使用这项技术来解决控制流量劫持来阻止攻击者使用从可执行内存运行的现有代码以创造性必威客服app的方式来更改程序行为。
  • 任意代码保护(ACG)帮助防止恶意攻击者通过内存安全漏洞将其选择的代码加载到内存中,并能够执行该代码。任意代码保护阻止将任何内存分配为可执行文件,这就产生了与JIT (Just-in-Time)编译器等方法的兼容性问题。

我们很高兴微软正在考虑提高Edge浏览器的安全标准。在2021年Chrome出现前所未有的零日之后,以及一系列与微软产品相关的高调安全事件之后,这是一个值得欢迎的转变。

自己试试

想要自己尝试Super Duper安全模式的用户将必须获得一个微软Edge预览版(Beta版、Dev版或Canary版)。如果你有一个运行,你可以插入优势:/ /标志/ # edge-enable-super-duper-secure-mode进入浏览器的地址栏,并将新功能设置为“启用”。

由于这是一个实验,我们不需要非常认真地对待超级骗子安全模式的名字。它可能不会在这里停留,可能表明禁用JIT编译器而不替换它将成为主流的可能性有多大。

保持安全,大家好!