JavaScript Template Attacks: Automatically Inferring Host Information for Targeted Exploits
(NDSS 2019)Michael Schwarz, Florian Lackner, Daniel Gruss Graz University of Technology
一、主要内容
本文发现了JavaScript中存在环境相关的属性,并设计实现一种全自动检测相关属性的方法,并对该方法进行测试及分析,以及展示该方法的结果可以用于哪些方面。
二、研究背景及动机
背景
1、在JavaScript中有许多属性是文档(比如MDN)中没有提及到的。
2、由于JavaScript是运行沙盒中的,这些属性本不应该泄露环境信息,但实际上确实泄露了。
研究动机
1、For side-channel attacks
了解受害者的某些硬件配置
2、For phishing attacks
了解目标的环境属性使得攻击更加合理
3、For criminals
越来越多的web浏览器和扩展提供匿名特性来隐藏用户的详细信息。这些功能主要用于逃避网站和广告的追踪,犯罪分子也使用这些功能来防止身份识别。因此,不仅追踪公司,执法机构也有兴趣发现破坏这些匿名特征的缺陷。
4、For targeted exploitation
对于使用zero days的目标攻击,必须尽可能多地获取有关目标的信息。失败的攻击尝试(例如,由于错误猜测的操作系统)可能会消耗zero days attack
注:zero days attack
“零日漏洞攻击”又叫零时差攻击,即安全补丁与漏洞曝光的同一日内,相关的恶意程序就出现,并对漏洞进行攻击。它是利用以前未知的软件缺陷,缩短攻击时间,在安全产品发生作用之前攻击就已达到顶峰,这种攻击很少发生,但危险性也尤为严重。
三、论文设计相关技术
1、浏览器指纹
不同浏览器之间的实现细节差别很大。不同之处在于支持的标准化特征、浏览器特有的特征以及根据标准未定义的方面。使用JavaScript,一种所有现代浏览器都支持的脚本语言,网站可以收集关于浏览器具体实现的信息。此外,JavaScript允许获取有关主机系统的详细信息,例如屏幕分辨率、操作系统、已安装的插件。这可以用于使网站适应用户设备和环境的特定属性,从而提供最佳的用户体验。然而,网站可获得的信息量也可能被滥用,以创建由一组属性组成的指纹。这样的指纹可用于跨多个会话甚至跨网页唯一地标识浏览器,从而标识用户。
浏览器指纹识别尝试在多个网页或访问同一网页时唯一地标识用户,而不在浏览器中存储信息。因此,浏览器指纹识别不依赖于cookies等经典的跟踪机制,因此用户很难阻止跟踪。指纹识别通常是通过一个脚本来完成的,该脚本在用户访问网站时执行。此脚本收集浏览器的若干属性,如浏览器版本、操作系统、屏幕分辨率或已安装的插件。虽然每个属性本身都不允许跟踪用户,但属性的组合是唯一的,足以标识用户。
2、反指纹机制
反指纹方法确保用户不能被跨网站跟踪,通过用户对网站的使用模式防止去符号化。因此,试图揭示此类用户身份的攻击者不能仅仅依靠使用指纹跟踪用户。
为了防止用户的跟踪和识别,一些软件和研究项目试图最小化指纹表面。实现这一目标主要有两种途径。首先,一些应用程序,例如Tor浏览器,通过不公开属性或在所有平台上用相同的值替换属性来隐藏属性的实际值。Tor浏览器试图阻止依赖浏览器属性的指纹识别尝试,这些属性可以使用JavaScript、插件或CSS进行检索。因此,默认配置中所有Tor浏览器的指纹应该是相同的。此外,还有用于隐藏属性值的浏览器扩展,以及可用于从网站进行指纹提取的完整功能。
其次,一些应用程序,例如一些浏览器试图通过随机化属性来破坏指纹的稳定性。欺骗属性的方式是,它们对于后续访问一个站点是相同的,但在域之间是不同的,以防止跨域跟踪。但是,反指纹机制可以通过它们创建的附加值、缺失值或不一致值来检测。
3、微体系结构攻击
微体系结构攻击近年来得到了广泛的关注。通常是利用微体系结构行为的定时攻击,例如缓存、分支预测或动态存储器。特别是高速缓存,在过去几年的许多攻击中被利用,导致不同的攻击技术。Osvik等人描述了逐出+时间,当攻击者测量清除缓存集对受害者运行的算法运行时的影响时,和Prime+Probe ,攻击者持续测量受害者是否逐出特定缓存集中的缓存线。Yuval和Falkner[81]描述了Flush+Reload,攻击者在这里连续测量受害者是否重新加载了缓存线。有人提出了这些攻击的几种变体,例如Flush+Flush、Evict+Reload。最近发现的熔毁和幽灵诡计是更强大的微体系结构攻击。在某些情况下,它们可以从其他上下文中的任意内存位置推断值。
4、JavaScript中的微体系结构和侧通道攻击
尽管微体系结构攻击利用了对非常低级别CPU的影响,但它们甚至可以从JavaScript中利用。与本机代码相比,JavaScript代码是沙盒式的,在多线程方面没有那么强大。因此,攻击者必须克服几个挑战
直到许多微体系结构属性都可以从JavaScript中推断出来。此外,在许多移动设备和现代浏览器上发现的传感器引入了可以 利用JavaScript。研究还表明,微结构特性可用于指纹分析。
5、基于模块的泄露检测
模板攻击作为一种强形式的侧信道攻击。首先从攻击者控制的设备(所谓的模板)收集侧信道跟踪。然后,从处理一个未知秘密的相同设备上收集一个跟踪。最后可以通过将跟踪与记录的模板进行比较来恢复未知机密。Brumley和Hakala将模板攻击应用于基于缓存的定时攻击。它们依赖Prime+Probe自动检测和利用缓存泄漏。但是,他们的方法仅限于与受害者运行在同一CPU核心上的攻击者。Gruss等人演示了基于Flush+reload的模板攻击,以自动检测和利用缓存泄漏。由于他们的攻击利用共享的最后一级缓存,因此它不依赖于攻击者在与受害者相同的核心上运行的能力。Weiser等人。动态检测二进制文件以生成包含所有内存访问的模板。通过比较不同机密输入的模板,它们可以自动检测二进制文件是否包含依赖于secret的内存访问。在更高的层次上,Spreitzer等人通过procfs伪文件系统和Android API,使用对Android的模板攻击推断应用程序启动和访问网站。对于这两种方法,他们首先通过从proc文件系统或Android API收集所有可用信息来创建模板。在分析阶段,他们比较从不同应用程序收集的模板,以根据模板对应用程序启动和指纹网站进行分类。
四、研究方法和思路
作者提出的自动化方法主要有两个部分
A. Profiling Phase
第一个阶段是概要分析阶段,它构建由多个概要文件组成的模板。分析阶段完全在浏览器中运行,并使用JavaScript实现。
第一步,分析代码创建一个可从JavaScript访问的属性列表。在JavaScript中,可访问的属性可以是函数、数字、字符串、布尔值、数组或对象。我们将数字、字符串和布尔值称为基本类型,因为它们只有一个值,可以直接访问和读取。对象和数组(只是对象的一种特殊类型)是复杂的类型,因为它们没有一个通用的可比值。相反,它们由多个基本类型和可能更复杂的类型组成。
又包括两个步骤
探索步骤:分析阶段的第一步是探索所有可访问属性的列表。我们利用了反射和遍历对象属性的JavaScript功能。
收集步骤:在收集步骤中,JavaScript代码创建一个概要文件,其中包含在探索步骤中识别的属性及其值。收集步骤再次在浏览器中以JavaScript运行。
B .分析阶段
第二个阶段是分析阶段,分析阶段是一个脱机阶段,它查找泄露有关环境信息的属性。与分析阶段相比,模板过程的第二个阶段并不在浏览器中运行。
1)清理步骤:
第一步,必须清理模板。在分析阶段收集的概要文件通常包含重复的属性。造成这种情况的原因有很多。首先,JavaScript对象通常与其他对象紧密相连。这将在配置文件中创建名称不同但属性相同的条目。其次,由于我们收集所有属性的方法,一个对象的相同属性可能会被收集多次。删除重复项之后,清理步骤必须识别非静态的属性。
2)属性提取步骤:使用清理后的模板,属性提取步骤识别泄漏信息的属性。在这一步中,我们首先从模板的所有概要文件中创建所有属性的联合。这是必要的,在许多情况下并不是所有的属性都出现在所有配置文件中。
五、研究结果的应用
1、浏览器检测
浏览器都有自己的JavaScript和渲染引擎。因此,可利用的漏洞通常仅限于一个浏览器。特别是那些严重依赖浏览器内部功能的漏洞仅限于特定的浏览器。浏览器之间的差异不仅阻止了一个浏览器在不同的浏览器中工作,而且还使区分浏览器变得容易。每个浏览器都支持一组不同的函数,并通过所谓的供应商前缀提供特定于浏览器的属性。主要浏览器的文档属性数量已经有了很大的不同,此外,由于不同浏览器的JavaScript引擎不同,属性值也不同。
总之,使用JavaScript模板攻击,即使是共享一个公共代码库的浏览器也可以很容易地区分出来。对于所有测试过的浏览器,对于许多漏洞攻击,不仅需要知道受害者使用的浏览器,还需要知道确切的浏览器版本。随着漏洞的暴露,浏览器供应商通常会在下一个版本中修复漏洞。因此,要在浏览器上可靠地运行攻击,了解浏览器版本对于选择工作攻击非常重要。
2、隐私扩展保护
浏览器有几个增强隐私的扩展,例如广告屏蔽或反跟踪扩展。其中一些修改发送到服务器的信息或覆盖JavaScript功能。通常,这样的插件会更改可从JavaScript访问的属性,因此JavaScript模板攻击可以检测到此类插件的存在。
JavaScript模板攻击是隐私增强扩展开发人员测试其扩展的一种有价值的方法。如果扩展试图隐藏引用而不是使其不可访问,则很容易再次暴露它们,从而使攻击者能够轻松绕过扩展。JavaScript模板攻击很容易在开发过程中发现这种泄漏的引用。
3、专用模式检测
与隐私增强扩展类似,Firefox、Chrome和Edge提供了内置的私有浏览模式。在此模式下,浏览器不会保留已访问网站的任何跟踪,如cookies或历史记录。此外,私人浏览还包括一些跟踪保护。
在Chrome中,在私有浏览模式下使用浏览器时没有检测到的差异。类似地,我们无法检测普通模式和来宾模式之间的差异,这与私有浏览模式类似。然而,对于Firefox,有一些属性显示当前窗口是私有浏览窗口还是普通窗口。例如,服务人员在私人浏览模式下不可用。对于Edge,我们还可以检测窗口是处于私有浏览模式还是正常模式。
4 操作系统检测
如果利用漏洞与环境交互,例如访问特定于操作系统的资源,则攻击者必须知道使用的是哪个操作系统。安装了一个JavaScript模板攻击,来检测是否有任何属性会泄露底层操作系统。
了消除操作系统以外的影响,在可能的情况下,对不同操作系统的同一硬件发起攻击。Tor浏览器积极尝试消除操作系统之间的所有差异。不过,操作系统之间的某些属性有所不同。尽管Tor浏览器警告用户不要调整窗口大小以防止使用这些属性进行指纹识别,但它们并不总是相同的。这种差异不仅存在于Tor浏览器中,也存在于Chrome浏览器中。对于Firefox,检测到更多的属性,这些属性可以更好地指示底层操作系统。
5 构架检测
对于运行二进制代码的漏洞攻击,了解当前的ISA至关重要。假设一个错误的ISA(例如x86而不是ARM)会导致一个不成功的攻击。在这两种情况下,攻击尝试不仅失败,而且可能被检测到。与所有其他属性一样,Tor浏览器尝试在所有架构上提供相同的功能和属性。在所有桌面操作系统上,Tor浏览器都将平台报告为Win32,与实际操作系统或ISA无关。
运行JavaScript模板攻击时发现了一个差异。在那里,平台没有报告为Win32,但是实际的平台被报告。
六、分析JavaScript获取相关信息原因
1 指令集体系结构
JavaScript是在沙箱中执行的解释语言。因此,语言本身独立于它运行的机器的指令集体系结构(ISA)。然而,出于性能原因,经常执行的JavaScript函数被编译成使用即时(JIT)编译器的机器代码。尽管JavaScript不受ISA的影响,但是JIT编译器受到当前平台ISA的限制。
两个几乎完全相同的代码片段,用于检测代码是在32位还是64位环境中运行。在64位环境中,两个函数的执行时间基本相同,而在32位环境中,Firefox/Tor浏览器实时编译器为正确的函数生成较慢的代码,因为可用于存储中间结果的寄存器较少。
2 内存分配器
许多浏览器攻击都依赖于底层内存分配器。缓冲区溢出和“使用后释放”漏洞通常需要了解内存布局,才能进行可靠的攻击。由于浏览器使用不同的内存分配器,可靠的漏洞利用需要有关分配策略的信息。
迭代一个大数组会在不同的数组索引下显示时间峰值。这些距离是由内部内存分配器造成的,它必须分配新的内存块。最容易检测到的定时(因此在直方图中具有最高频率)是由于分配器从操作系统请求更多内存而导致的缓慢计时。
我们只关注分配器本身的时间差异,而不是操作系统引起的时间差异。请注意,页面错误当然也可以用于了解有关环境的信息。然而,由于大多数系统使用的页面大小为4KB,因此利用这一侧通道获取的信息不多
为了推断关于浏览器内存分配器的信息,我们首先分配一个几千字节的小数组。然后,我们选择512b的步长,并按这个步长连续地调整数组的大小。对于每次调整大小,我们都会使用performance.now()。现在结合边缘阈值处理。这将导致足够高的计时器分辨率,以查看内存分配器的活动。与没有内存分配器活动的访问相比,该活动的计时稍微高一些。
通过比较高定时之间的距离,我们可以推断内存区域的分配大小。上图显示了Firefox和Chrome的时间差异柱状图,按内存分配器使用的典型大小分组。Chrome(512 KB)和Firefox(1 MB)的默认分配大小都正确检测到。
3图表算法
WebGL允许浏览器访问显卡的低级属性和功能。可从图形卡收集的信息量已被用作浏览器指纹识别的来源。尤其是由于WebGL不需要任何浏览器权限,因此它是一个易于使用的属性源。展示了JavaScript模板攻击可以简单地进行扩展,以检测WebGL扩展中的泄漏属性。
将canvas元素和WebGL对象作为人工属性添加到window对象中。上图显示了将WebGL作为人工属性添加到对象层次结构中的相应代码。WebGL需要一个HTML画布元素来实例化WebGL扩展。我们还将canvas元素作为一个人工属性添加到window对象中,因为它也包含属性。
七、论文总结
亮点
提出一种自动化推断浏览器信息(不止浏览器慕至底层操作系统,指令集架构等)的方法,获取JavaScript中的所有属性,对这些属性构建模板,在不同环境下(控制变量法!!)进行测试,找出其中表现具有差异性的属性,则这些属性是环境相关的属性。
总结
提出了一种全自动检测环境造成的浏览器引擎中的细微差别的属性,并自这种方式是十分高效的
展示了关于浏览器的两种新的侧信进方式,可以检测指令集体系结构和使用的内存分配器
本文提出的技术基至能在运行若防指纹识别机期的环境下使用,并且适用于自动指纹识别方向
八、论文复现
JavaScript模板攻击是一种工具,可以自动发现浏览器引擎中由环境引起的细微差异。JavaScript模板攻击的主要用例是为防御机制的开发过程提供自动扩充。
但是,它也可以用来帮助寻找指纹,或者更精确地了解受害者的环境,以便有针对性地进行剥削。
该工具完全是用JavaScript实现的。前端在浏览器内部运行,后端在节点.js. 设置该工具非常简单,只需运行node server这个命令就可以启动监听端口8080的本地服务器。
打开 (http://localhost:8080),以进入工具的主菜单。主站点显示所有记录的配置文件
流程
1、配置node.js
Node.js 是运行在服务端的 JavaScript。node.js 是一个基于Chrome JavaScript 运行时建立的一个平台