谷歌展示了通过在浏览器中执行 JavaScript 来利用 Spectre 漏洞

谷歌已经发布了多个利用原型,显示了在浏览器中执行 JavaScript 代码时利用 Spectre 类漏洞的可能性,绕过了之前添加的保护方法。 漏洞可用于访问正在处理当前选项卡中的 Web 内容的进程的内存。 为了测试该漏洞的运行情况,我们启动了leaky.page 网站,并在 GitHub 上发布了描述工作逻辑的代码。

该原型旨在攻击 Linux 和 Chrome 7 环境中采用 Intel Core i6500-88U 处理器的系统。需要进行更改才能将该漏洞应用到其他环境。 该漏洞利用方法并非针对英特尔处理器,经过适当调整后,该漏洞被证实可以在其他制造商的 CPU 系统上运行,包括基于 ARM 架构的 Apple M1。 经过细微调整,该漏洞也适用于其他操作系统和基于 Chromium 引擎的浏览器。

在基于标准 Chrome 88 和 Intel Skylake 处理器的环境中,数据从当前 Chrome 选项卡中负责处理 Web 内容的进程(渲染器进程)中泄露,泄漏速度为每秒 1 KB。 此外,还开发了替代原型,例如,当使用精度为 8 微秒(5 毫秒)的 Performance.now() 计时器时,可以以降低稳定性为代价将泄漏率提高到 0.005kB/s。 。 还准备了一种变体,其计时器精度为一毫秒,可用于以每秒约 60 字节的速度组织对另一个进程的内存的访问。

发布的演示代码由三部分组成。 第一部分校准计时器,以估计恢复由于 CPU 指令的推测执行而留在处理器高速缓存中的数据所需的操作的执行时间。 第二部分确定分配 JavaScript 数组时使用的内存布局。

第三部分直接利用Spectre漏洞来确定当前进程的内存内容,为某些操作的推测执行创造条件,其结果在确定预测不成功后被处理器丢弃,但执行跟踪存储在通用缓存中,并且可以通过分析缓存和非缓存数据的访问时间变化的第三方渠道使用确定缓存内容的方法来恢复。

所提出的利用技术消除了通过 Performance.now() API 提供的高精度计时器,并且不支持 SharedArrayBuffer 类型,该类型允许在共享内存中创建数组。 该漏洞利用包括 Spectre 小工具(它会导致受控推测代码执行)和侧通道泄漏分析器(它确定在推测执行期间获取的进入缓存的数据)。

该小工具是使用JavaScript数组实现的,其中尝试访问缓冲区边界之外的区域,由于编译器(处理器,向前看)添加的缓冲区大小检查而影响分支预测块的状态,推测性地执行访问,但在检查后回滚状态)。 为了分析定时器精度不足的情况下缓存的内容,提出了一种欺骗处理器中使用的Tree-PLRU缓存驱逐策略的方法,并允许通过增加周期数来显着增加返回一个值时的时间差。缓存中的值以及缓存中没有值时。

值得注意的是,谷歌发布了一个原型漏洞利用程序,以展示利用 Spectre 类漏洞进行攻击的真实性,并鼓励 Web 开发人员使用可最大限度降低此类攻击风险的技术。 与此同时,谷歌认为,如果不对所提出的原型进行重大修改,就不可能创建不仅可供演示而且可供广泛使用的通用漏洞利用程序。

为了降低风险,鼓励网站所有者使用最近实施的跨源开放器策略 (COOP)、跨源嵌入器策略 (COEP)、跨源资源策略 (CORP)、获取元数据请求、X-Frame-Options、 X -Content-Type-Options 和 SameSite Cookie。 这些机制不能直接防止攻击,但可以隔离站点数据,防止其泄漏到可以执行攻击者 JavaScript 代码的进程中(泄漏发生在当前进程的内存中,其中除了攻击者的代码之外,还包括数据)来自在同一选项卡中打开的另一个站点)。 主要思想是在不同的进程中将站点代码的执行与从不可靠来源(例如通过 iframe 包含的)获取的第三方代码分开。



来源: opennet.ru

添加评论