首页 > 技术文章 > 《网络攻防实践》综合实践

20199321zjy 2020-06-30 20:22 原文

在现代浏览器中,时序攻击一直是对用户隐私的威胁。为了减少此类攻击,现有的方法(如TorBrowser和Fermata)会在浏览器时钟中添加抖动,这样攻击者就无法准确地度量事件。然而,这样的防御只会提高攻击者的门槛,而不会从根本上减少定时攻击,只是需要比以前更长的时间来发动定时攻击。在本文中,提出了一种新的方法,称为确定性浏览器,它可以有效地防止现代浏览器中的时序攻击。借鉴物理学,引入了几个概念,如观察者和参考系。具体来说,一个JavaScript片段,参考帧中的观察者将始终获取相同的、固定的定时信息,以防止定时攻击;相反,一个用户将以不同的方式感知JavaScript,并且不会体验到性能下降。本文已经实现了一个原型,评估表明该原型可以抵御与浏览器相关的时序攻击。


1 背景知识


1.1 研究问题

  • 时序攻击(Timing Attacks) 属于侧信道攻击/旁路攻击(Side Channel Attack),侧信道攻击是指利用信道外的信息,比如加解密的速度,加解密时芯片引脚的电压,密文传输的流量和途径等进行攻击的方式。

举例说明:字符串间的比较
其实现是基于移位匹配。遇到任何不匹配则直接退出返回比较结果。
于是代码循环的次数不一样的导致执行耗时也是不一样的,时间的不同也就知道了大概是哪一位开始不同的。

  • 论文中所给的定义:时序攻击是指敌方试图使用物理时间的参考时钟来测量目标或秘密事件(目标机密)的持续时间。
    • 目标机密是一个对手不知道需要多长时间才能完成的事件
    • 参考时钟用于测量目标机密,隐式或显式的。
    • 攻击者是主体,目标秘密是客体,参考时钟是主体用来窃取客体的工具。

1.2 相关概念

  • 时序攻击是指敌方试图使用物理时间的参考时钟来测量目标或秘密事件(目标机密)的持续时间。
  • 成功发起时序攻击的必要条件攻击者(adversary),目标机密(target secret)和参考时钟(reference)三个关键要素,必须同时存在于运行时环境中。
  • 参考系(reference frames,RFs)有一个独立的时钟,有的还有一个观察者,观察者的工作是测量RF中事件的持续时间,即在事件开始和结束时进行两次观察,获得两个时间戳并计算间隔。一个重要特性是,一个RF中只能执行一个事件(例如,目标机密或隐式时钟滴答事件),不同的事件分别在不同的RF中执行。RFs可以根据观察者的存在进行分类,存在观察者的称为主RF,而另一个没有观察者称为辅助RF。当观察者不在时,RF中的时钟处于未定义状态,因为只有观察者存在时才能获得时序信息。然后,当观察者回来时,时钟就可以使用了。
  • 确定性:观察者可以不看时钟而根据已知的条件来测量任何事件的持续时间。

其他相关的定理和概念在讲解如何抵御的过程中提出,便于理解。


2 威胁模型


从三个方面介绍威胁模型:

  • 范围内攻击(In-scope Attacks):在威胁模型中加入了与浏览器相关的时序攻击。这样的攻击之所以成为可能,是因为对手可以使用参考时钟在客户端浏览器上测量目标机密的持续时间。也就是本文所要解决的问题。
  • 范围外攻击(Out-of-scope Attacks):将定时攻击中的目标机密限制为与浏览器相关,并根据其他方(如web服务器和用户)排除这些机密。这种限制是很自然的,因为我们只让浏览器具有确定性,而不是其他浏览器。也就是和浏览器无关的攻击不再本文研究范围内。
  • 激励示例(A Motivating Example)
    • 同步攻击采用时钟边缘技术,通过在主时钟的两个边缘之间多次重复该操作来测量一个小时钟,例如一个简单、廉价的JavaScript操作,如count++。然后,可以通过将主时钟的粒度除以执行的操作数来计算副时钟。
    • 异步攻击采用隐式时钟,来测量异步目标机密,例如解析第三方响应的时间。
    • 攻击过程分析:

同步攻击:(第1-8行)NextEdge函数试图找到时钟的下一个边缘(根据演出现在)并计算下一个时钟边缘执行的操作数。对于JavaScript指纹攻击(第9-12行),可以先跳过当前主时钟周期的其余部分(第11行),然后计算整个主时钟周期(第12行)中用于指纹识别的操作数。对于侧通道攻击(第13-21行),可以找到指纹(第14行),从新边开始(第15行),然后使用主时钟测量目标机密(第16-18行)。计算副时钟中的剩余周期(第19行),通过组合副时钟和主时钟(第20行)计算目标机密的持续时间。

异步攻击:sideChannelAsync函数(第25-28行)调用异步目标秘密函数,为了简单起见,我们只使用回调函数(第26行),隐藏函数中的细节。然后,通过setInterval函数调用隐式时钟,countFunc作为回调(第27行)。countFunc将以u间隔定期调用,直到调用回调,即目标机密完成执行。然后,可以根据执行countFunc的次数计算目标机密的持续时间(第24行)。


3 解决方案


3.1 方案提出

  • 已知,成功发起时序攻击的必要条件是对手,目标机密和参考时钟三个关键要素,必须同时存在于运行时环境中,那么一个自然的解决方案就出现了,就是从运行时环境中删除三个关键元素中的一个或多个,打破必要的条件。但是,这三个元素在浏览器中都是必需的,并且很难删除。因为对于攻击方的检测就是一个研究的大方向,其误报和漏报是难以避免的;再有目标机密如果是一种常见的浏览器操作,像是脚本解析,如果删除就将破坏浏览器功能; 最后,对于参考时钟来说,显式参考时钟是可以删除的,但是由许多隐式时钟有助于实现基本的浏览器功能,不能删除。
  • 但这个方案的思路是没有错的,要打破时序攻击发起的必要条件。本文中就做出了进一步的修改:在确定性浏览器的方案中,没有从整个运行时环境(也就是web浏览器)中删除关键元素,而是将web浏览器分解为几个较小的单元,并从这些较小的单元中删除一个或多个不同的关键元素。也就是说,从宏观的角度来看,这三个关键元素仍然存在于web浏览器中;从微观的角度来看,最多有两个元素存在于一个较小的单元中。
  • 引入的更小的单元就是前文所提及的参考系(reference frames,RFs)。

3.2 如何让RF具有确定性?

  • 一个理想而简单的解决方案是使每个RFs都具有确定性。但在某些情况下,这样的解决方案也是不可能的。例如,网络消息可能包含关于物理时钟的信息,因为它属于外部世界,没有办法使这种RF具有确定性。但在论文中,给出了一个定理: 如果具有目标机密的RF是确定性的,则无论在该RF中还是在另一RF中,攻击方观察者都无法推断目标机密。
  • 我们的目标是测量目标秘密时,观察者总是获得相同的定时信息。具体地说,确定性将目标机密规范化,以便从观察者的角度来看,目标秘密的结束时间戳和开始时间戳之间的增量始终是相同的,确定的,即使目标秘密在不同的运行时环境中多次发生。
  • 因此,我们不必让每个RFs都具有确定性,而是使得具有目标机密的RF是确定性的即可。

举例说明:确定性JavaScript RF

  • 为了执行JavaScript程序,浏览器(特别是JavaScript引擎部分)将解析JavaScript程序并将其转换为一种特殊的形式,称为操作码,有时也称为字节码。然后,根据执行模式,即解释器或即时(JIT)编译,操作码将被解释或转换为机器码以供执行。
  • 给定一组由程序生成的操作码(SO),一个固定的初始状态和一组固定的输入。仅当以下条件适用于在不同运行时环境中时, JavaScript-RF是确定性的。任意两个执行(E1和E2):对于E1和E2中的每个操作码(op∈SO):

推荐阅读