SharedArrayBuffer 如何用于定时攻击?

信息安全 javascript 幽灵
2021-08-23 14:59:46

由于这类新攻击涉及测量精确的时间间隔,作为部分的、短期的缓解措施,我们正在禁用或降低 Firefox 中多个时间源的精度。performance.now() 的精度已从 5μs 降低到 20μs,并且 SharedArrayBuffer 功能已被禁用,因为它可用于构造高分辨率计时器。

Mozilla 基金会安全公告 2018-01

如何使用 SharedArrayBuffer 构造一个高分辨率的计时器?它不只是一个带有特殊规则的缓冲区,允许它直接传递到另一个上下文而不是克隆它吗?

1个回答

SharedArrayBuffer允许两个线程共享状态,因此一个可以作为“时钟”运行(递增定时信号),另一个可以读取“时钟”。此外,Atomics对象的可用性允许以一种使递增有效的方式执行操作,SharedArrayBuffer并且可以被读取线程看到而没有竞争条件的风险。

诚然,这个计时器仅以“其他线程增量的速度”而不是“秒”为单位,但对于计时攻击,攻击者感兴趣的数据是相对计时。知道给定的高速缓存行(在 Spectre 的情况下)加载速度比其他高速缓存行表明它已被 CPU 预缓存。对于诸如密码比较之类的定时攻击也是如此(正确的字符比不正确的字符花费一定比例的时间)。

可以针对已知时钟参考(即,从 performance.now())校准快速时序循环以获得每个增量的平均时间,但仍然会有一些小的抖动。