用差分模糊测试做Side-Channel分析

DIFFUZZ: Differential Fuzzing for Side-Channel Analysis


Remark

Conference: ICSE 2019

Full Paper: yannicnoller.github.io/

Code: github.com/isstac/diffu

News: 对该工作的进阶版“HyDiff: Differential software analysis”已被ICSE2020接收


Abstract

Side-channel attacks allow an adversary to uncover secret program data by observing the behavior of a program with respect to a resource, such as execution time, consumed memory or response size. Side-channel vulnerabilities are difficult to reason about as they involve analyzing the correlations between resource usage over multiple program paths. We present DifFuzz, a fuzzing-based approach for detecting side-channel vulnerabilities related to time and space. DifFuzz automatically detects these vulnerabilities by analyzing two versions of the program and using resource-guided heuristics to find inputs that maximize the difference in resource consumption between secret-dependent paths. The methodology of DifFuzz is general and can be applied to programs written in any language. For this paper, we present an implementation that targets analysis of Java programs, and uses and extends the Kelinci and AFL fuzzers. We evaluate DifFuzz on a large number of Java programs and demonstrate that it can reveal unknown side-channel vulnerabilities in popular applications. We also show that DifFuzz compares favorably against Blazer and Themis, two state-of-the-art analysis tools for finding side-channels in Java programs.

Background


Side-Channel Attack(旁路攻击):

在密码学中,旁路攻击又称侧信道攻击、边信道攻击(英语:Side-channel attack)是一种攻击方式,它基于从密码系统的物理实现中获取的信息而非暴力破解法或是算法中的理论性弱点(较之密码分析)。例如:时间信息、功率消耗、电磁泄露或甚是声音可以提供额外的信息来源,这可被利用于对系统的进一步破解。某些侧信道攻击还要求攻击者有关于密码系统内部操作的技术性信息,不过,其他诸如差分电力分析的方法在黑盒攻击中效果明显。许多卓有成效的侧信道攻击基于由保罗·科切开拓的统计学方法。需要注意的是,如果破解密码学系统使用的信息是通过与其使用人的合法交流获取的,这通常不被认为是旁路攻击,而是社会工程学攻击。

Side-Channel Analysis:

  • 如果攻击者无法通过对系统的观察推断出机密数据,则安全(也称为不干扰)
  • 可以通过self-composition来分析 [Barthe2004]


Example

本文以一个密码检查的例子来说明Side-Channel 分析。下图的两个例子分别以不安全和安全的方式显示了将用户密码与服务器端存储的密码进行比较的代码。第一个例子是一个不安全的代码,因为密码正确和密码错误时存在一个时间差异。攻击者可以通过增量猜测来找到正确的密码(先猜第一位,猜错的话程序执行只会进入第5行1次,猜正确的话会进入2次)。相比之下,第二个例子显得更安全。



Approach

Side-channel分析有个经典的self-composition方法,如下图所示。如果攻击者无法通过对系统的观察推断出机密数据,则安全(也称为不干扰)


在Fuzzing方面,融合了self-composition的思想,同时测试一个程序的两个copies,观察两个输出的difference。

Fuzzing策略上,引导程序的执行增大这两个输出的difference(即下图的cost1和cost2的diff)。


最后,再让我们将前面的示例用DifFuzz运行一次。


Evaluation

  • build on top of AFL [AFL, Kersten2017, Noller2018]
  • Blazer [Antonopoulos2017]
  • Themis [Chen2017]
  • and more projects from GitHub, and STAC [DARPA2018]
  • runtime: 30min, 5 times


Personal Thoughts

亮点:

  • 应用场景好,一般fuzzing的目标是找程序的crashes,DifFuzz是利用fuzzing这个技术去进行resource usage的分析,能找一些程序逻辑上面的问题(e.g., 密码破解,用户敏感信息泄露)。
  • 不仅关注资源消耗的最坏情况,而且关注最好情况(SlowFuzz和PerfFuzz只关注最坏情况)。更重要的是关注不同输入造成的资源消耗上的Diff
  • Diffuzz与其他工具相比的一个优点是,它不仅显示应用程序是否易受攻击,而且还显示了该漏洞的严重性。因为最好情况和最坏情况的差异能一定程度上能反应漏洞的严重程度,SlowFuzz和PerfFuzz没有考虑到这一点(SlowFuzz的Feedback是让|Max-0|增大, 而DifFuzz的Feedback是让|Max-Min|增大。SlowFuzz没有考虑到 Max 和Min之间的差异可以说明程序的安全性)。

局限:

  • Fuzzing本身就是以不同输入测试一个程序的过程,这整个过程就能判断出资源消耗的变化(如SlowFuzz,PerfFuzz),硬要做成Differential Fuzzing的意义何在(当然人家为了水Paper也不好说什么)。
  • 只能判断某个函数的安全性(单独测试密码函数),无法判断整个程序的安全性(如密码组件是安全的,而其它组件的时间消耗也有差异。例如SlowFuzz和Perffuzz揭露的算法复杂性问题而不是side-channal)
  • DifFuzz需要一些人为的努力(e.g. 需要人为编写驱动),并且将函数输入转化为(pub,sec)的形式。
  • 最好情况的探索经常是没必要的,类似SlowFuzz和PerfFuzz那样只探索最坏情况通常已经足够?其实SlowFuzz和PerfFuzz的方法也适用于这种问题。
  • DifFuzz对于内存消耗的测量方法不好,它是使用固定时间间隔的采样,其精度取决于采样的时间间隔。

编辑于 04-17

文章被以下专栏收录