b. 陆军装甲兵学院 演训中心, 北京 100072;
c. 陆军装甲兵学院 军政基础系, 北京 100072
b. Training Center, Academy of Army Armored Force, Beijing 100072, China;
c. . Department of Military and Politics, Academy of Army Armored Force, Beijing 100072, China
20世纪末, 旁路攻击的概念被提出, 并成为密码学领域的研究热点之一, 攻击者可以利用密码算法运行时所泄露的物理信息进行攻击。Cache计时攻击是旁路攻击的一种, 其利用计算机Cache泄露的时间信息进行攻击。根据计时信息采集模型的不同, Cache计时攻击分为时序驱动、访问驱动以及踪迹驱动3种。时序驱动攻击利用采集的整个密码的加密和解密时间, 通过统计方法分析密钥。文献[1]利用密码整体执行时间与采集的Cache计时信息之间的关系, 对AES对称密钥进行攻击。基于时序驱动的Cache计时攻击需要采集大量的样本, 其分析方法复杂, 但由于采集方法较简单, 因此该攻击拥有较好的跨平台特性。访问驱动攻击主要利用计算机系统在不同进程中共享Cache的特性, 其采集方法复杂, 但分析方法较简单。利用计算机共享Cache的特性, 文献[2]在OpenSSL中实现了AES密码算法攻击并获取了全部密钥, 文献[3]在Android设备中能够判断用户的点击、长按和滑动等操作, 并获取AES加密算法的密钥。踪迹驱动攻击[4-5]需要采集一次密码加密多次导致的内部Cache访问碰撞信息, 得到每次加密所有查表的Cache命中和失效序列, 通过该序列信息进行攻击。
访问驱动攻击模型简单, 且具有较好的攻击效果。在Cache计时攻击模型中, 基于访问驱动攻击模型得到了广泛应用。传统的访问驱动攻击模型[6]在清空整个Cache后, 需要再次运行受害程序以判断其访问过的Cache组。随着计算机技术水平的发展, 精度更高的攻击方法相继被提出, 如Prime+Probe[7]、Flush+Reload[8-10]、Evict+Reload[11]、Flush+Flush[12]等。2018年1月, CPU被披露出Meltdown和Spectre 2组漏洞[13-14], 利用处理器的乱序执行和预测执行的缺陷, 攻击者使用基于访问驱动攻击模型的Flush+Reload方法对CPU进行攻击, 利用Cache命中与失效的时间差异来确定受害进程访问过的Cache行, 从而获取内核和其他进程的数据。
模板攻击是一种结合概率统计的旁路攻击方法。文献[15]提出一种Cache模板攻击, 该攻击对指定范围地址采集Cache命中与失效信息, 将Cache命中视为1, Cache失效视为0, 建立一条关于地址的命中与失效轨迹, 最后利用均方误差函数进行评估预测。该模板基于每条地址的Cache命中与失效信息建立, 但是在实际应用中, 采集Cache命中与失效信息容易受到环境的影响, 即使发生Cache命中, 采集的时钟周期也比Cache失效时长。为解决该问题, 有学者在模板建立时将命中率未达到1的地址统设为0, 但这种做法导致最后建立的模板准确率较低。由于Cache命中、失效是一个二进制向量, 在使用均方误差函数计算2条轨迹的差异时会忽略命中与失效的相关性, 即使两者不相关, 但是汉明重一样时会得到同样的结果。
本文使用Flush+Reload攻击方法, 设置阈值k(0 < k < 1), 当一个Cache行地址的命中率大于k时, 建立攻击模板时将该行地址视为命中, 并将该地址的模板值设为1。通过调节阈值k以建立更精确的攻击模板, 在此基础上, 提出一种以Pearson相关系数为判断标准的Cache计时模板攻击方法。
1 相关知识 1.1 Cache信息泄露原理Cache是位于CPU与主存之间的静态存储器, 用以解决两者之间速度不匹配的问题[16]。具有高速存储性质的Cache造价昂贵, 因此, 现代计算机的Cache大多采用多层次结构, 如图 1所示, 其中, 越靠近CPU的模块, 存储速度越快。
|
Download:
|
| 图 1 多层次Cache结构 | |
当CPU读取数据时, 先查看Cache中是否存在所需数据。如果存在, 则直接从Cache中读取数据, 此即Cache命中; 如果不存在, 则从内存中读取数据并将数据加载到Cache中, 此即Cache失效。Cache和内存在存取速度上存在差异, 内存的读取速度远小于Cache的存取速度, 故CPU访问内存所需的时间大于访问Cache所需的时间。根据该时间差异, 可以判断数据是否被访问过, 如果访问过, 则会在Cache中留下痕迹。
为防止内存中出现冗余数据, 操作系统使用共享内存为不同的程序进程提供共享数据。共享数据的内容包括二进制文件或者程序段, 每个程序都能访问共享内存, 如果程序对共享数据进行修改, 原有的共享内容将继续在各进程中进行共享。通过上述过程, 能够较好地解决内存数据冗余的问题, 同时降低Cache竞争并提高运行速度。很多程序拥有共性, 比如输入、显示以及一些程序代码。这种共享内存使得Cache计时攻击成为可能。操作系统通过将同一个物理地址空间映射到不同程序的虚拟地址空间, 以实现内存共享, 该映射方式如图 2所示, 其中, 不同程序对共享数据的打开与读取操作互不影响。
|
Download:
|
| 图 2 地址空间映射过程示意图 | |
利用间谍程序将受害程序的一段共享二进制映射到内存中, 当受害程序运行时, 则会直接从物理内存中获取数据, 且访问的数据将会停留在Cache中。因为这段共享二进制文件的物理地址对间谍程序透明, 间谍程序遍历所有固定地址范围, 通过访问数据时的Cache命中与失效差异, 以判断受害程序访问的数据。
在X86 CPU中, 本文使用rdtsc指令从CPU时间戳寄存器TSC中获取执行周期, 通过rdtsc指令, 能够在用户环境下获取纳秒级的计时并精确区分Cache的命中与失效信息。
1.2 Flush+Reload计时攻击方法文献[8]提出一种使用clflush指令实现高效访问驱动的Cache计时攻击方法, 该方法将Cache中的数据驱逐到内存中, 在执行受害程序的一小段指令后判断驱逐的Cache行数据是否重新加载到Cache中。文献[15]发现clflush指令会将所有等级的Cache行数据驱逐到内存中, 包括共享的LLC(Last-Level-Cache)。根据clflush指令的这一特性, 可以证实这种攻击方式能够实现跨核攻击, 即受害进程和间谍进程可以运行在同一CPU的不同核心中[16]。
Flush+Reload计时攻击方法步骤如下[16]:
1) 将二进制(共享库)映射到共享地址空间(进入Cache)中。
2) 从Cache中通过clflush指令刷新一个共享的Cache行。
3) 调用密码进程。
4) 检测第2步中被刷新的Cache行是否被密码程序载入到Cache中。
Flush+Reload方法的攻击原理与步骤如图 3所示。假设攻击一个8组4路的Cache[16], 目标地址(共享)映射到密码程序和间谍程序中, 如图 3(a)所示。间谍程序刷新共享的目标地址, 共享目标地址从Cache中被逐出, 如图 3(b)所示。然后, 运行密码进程, 发生Cache失效, 重新从主存中读取数据并载入到Cache中, 如图 3(c)所示。最后, 间谍程序利用Cache命中信息来检测上述刷新的目标地址是否被重新载入到Cache中, 如图 3(d)所示。
|
Download:
|
| 图 3 Flush+Reload方法攻击原理与步骤 | |
与Prime+Probe方法[7]相比, Flush+Reload攻击方法精度更高。Prime+Probe方法能够确定受害程序访问的Cache组, 但是Cache组一般有多个Cache行, Prime+Probe方法不能精确到Cache行。相比之下, Flush+Reload攻击方法能够精确到受害程序访问的Cache行, 因此, 其能够对键盘输入、云平台安全、由软件实现的密码算法等造成巨大威胁。
2 模板攻击建立 2.1 Cache计时信息采集攻击主要针对程序查询表进行操作, 将共享二进制映射到内存中, 监视指定范围地址空间的访问情况。在Linux操作系统中, 一般使用GDK框架作为默认的用户界面框架。在键盘输入时, 需要将键盘信号转化为Unicode编码并在显示器中显示。在转化的过程中, 会查询gdk_keysym_to_unicode_tab数组, 此时需要将相关数据加载到Cache中, Cache泄露的信息则能够被利用。gdk_keysym_to_unicode_tab数组包含在GDK库的一部分libgdk-3.so.0.2200.24中, 因此, 能够通过监视GDK的某些地址段来判断键盘的输入值。在非特权条件下, 本文使用map函数将libgdk-3.so.0.2200.24映射到内存中并监视这一段地址。为快速采集大量的按键信息, 使用libxdotool工具进行自动模拟输入。
Cache计时信息采集算法描述如下:
输入 事件集合E(键盘输入), 目标地址范围B, 持续时间t
输出 每个事件的Cache模板矩阵T
1.将目标地址B映射到内存中
2.for each event e in E do
3.for each address a in binary B do
4.while time < t do
5.触发event e并同时使用Flush+Reload方法对a进行攻击
6.记录Cache hit次数k和触发event e的次数n
7.end
8.计算命中率k/n并保存到T中
9.end
10.end
在Cache计时信息的采集过程中, 触发键盘输入的同时, 要对指定的目标地址进行攻击。每个目标地址都需要在时间t内采集Cache命中次数, 并记录时间t内触发事件e的次数。为保证采集的数据准确, 需要在持续时间t内触发多次事件e。持续时间t决定采集计时信息需要的时间, 如果时间t过短, 采集的命中信息数量较少, 数据不够准确; 如果时间t过长, 采集需要花费大量的时间。当发生Cache失效时, CPU获取数据时总是获取整个Cache行, 因此, 无法区分同一行中的地址偏移位, 且会从同一Cache行中的地址获取到相同的信息。在X86处理器上, 一个Cache行一般有64个字节, 在采集数据时, 一个Cache行只监督一个地址, 且不会降低准确度。
本文使用libxdotool工具连续模拟输入一定量的同一字符, 同时通过Flush+Reload攻击方法对地址进行监视。首先刷新一个地址, 然后重载判断该地址是否发生命中, 记录命中次数、触发按键输入次数以及命中率, 得到每个按键输入时间在每个地址上的命中率矩阵。
2.2 模板建立与分析对指定地址采集样本的命中率矩阵并进行分析, 由于攻击的地址库libgdk-3.so.0.2200.24有13 000多条地址, 较难通过庞大的地址段来建立攻击模板。因不知gdk_keysym_to_unicode_tab数组在地址库libgdk-3.so.0.2200.24中的准确位置, 只能通过命中率高的地址段来推测gdk_keysym_to_unicode_tab数组的大致位置, 即除去不相关的地址, 获取高命中率的地址, 以此建立有效的模板, 最终提高攻击效率。从命中率矩阵中除去冗余数据的方法如下:
1) 除去所有事件在这条地址上命中率的最大值和最小值难以区分的地址。
2) 除去所有事件在这条地址上命中率几乎都为0的地址。
在除去冗余数据后, 得到精简的Cache命中率模板矩阵T, 模板中的地址具有命中率高、易区分不同事件的特性。为将模板与监测到的Cache命中与失效轨迹进行匹配, 本文将命中率矩阵转化为二进制向量矩阵TB。如果将一个事件的命中率大于等于1的地址设置为1, 小于1的地址设为0, 使用该矩阵模板进行预测时的错误率将较高, 原因是在某些情况下即使发生Cache命中, 使用rdtsc指令获取的时钟周期会很大, 从而会将有关地址判断为无关地址, 即错误率提高。在模板建立时, 本文将命中率的阈值设为小于等于1的变量k, 根据k来调节模板矩阵, 从而获得更准确的攻击模板。
矩阵TB包含每个事件在指定地址段B的Cache命中与失效轨迹, 矩阵TB的每一个列是一个事件, 设每个事件的Cache命中与失效轨迹为
| $ r_{x y_{i}}=\frac{\operatorname{Cov}\left(\vec{\boldsymbol x}, \overrightarrow{y_{i}}\right)}{\sqrt{D(\vec{\boldsymbol x})} \sqrt{D\left(\overrightarrow{y_{i}}\right)}}, i \in B $ |
在计算每条模板的Pearson相关系数后, 取所有结果中的最大值进行判断。最终的预测结果与持续时间t、命中率的阈值k有较大关联, 持续时间t越大, 得到的命中率模板矩阵越准确。在实际应用中, 通过多次实验得到最优的命中率阈值k。
3 实验结果与分析本文攻击实验在kali Linux 2017.3版本操作系统中实现, 硬件平台CPU为Intel i7-4720HQ, 内存为16 GB。在命中率阈值设为1的情况下, 通过多次实验来获取合理的持续时间t。根据硬件CPU的频率, 将持续时间t的数量级定为108个CPU周期, 分别在0.5×108、1.0×108、1.5×108、2.0×108、2.5×108、3.0×108个时钟周期内进行实验, 结果如图 4、图 5所示。其中, 只对数字输入进行判断。从图 4可以看出, 持续时间t越长, 得到的攻击模板越准确, 但是当持续时间t>2.0×108个时钟周期时, 攻击模板的准确率上升不明显。从图 5可以看出, 实验所需的时间与持续时间t成正比。
|
Download:
|
| 图 4 判断准确率与持续时间t间的关系 | |
|
Download:
|
| 图 5 实验所需时间与持续时间t间的关系 | |
为兼顾实验效率, 选择持续时间t=2.0×108、t=2.5×108个时钟周期来获取攻击模板, 从而得到合理的阈值k。在模板建立过程中, 将阈值k从0~1分为10等分, 得到判断准确率结果如图 6所示。从图 6可以看出, k=0.9时的判断准确率比k=1.0时大。由于每次实验时噪声对结果的影响不同, 因此难以得到准确的阈值, 本文取阈值k=0.9。
|
Download:
|
| 图 6 判断准确率与阈值k间的关系 | |
在阈值k=0.9情况下建立模板, 使用Pearson相关系数法和均方误差法分别对输入值进行判断, 准确率比较结果如图 7所示。从图 7可以看出, Pearson相关系数法的判断准确率高于均方误差法, 原因是攻击模板只有0和1 2种情况, 当模板与采集的事件Cache命中轨迹的汉明重一样时, 均方误差法将失效。
|
Download:
|
| 图 7 2种方法的准确率对比 | |
本文针对Cache模板攻击容易受运行环境影响、模板判断方法准确率较低等问题, 提出一种基于Pearson相关系数的Cache计时模板攻击方法。实验结果表明, 该方法能够提高Cache模板攻击的判断准确率, 且合理的阈值可以使攻击模板更准确。下一步将引入机器学习方法, 以提高Cache模板攻击的效率。
| [1] |
SCHINDLER W.Cache based remote timing attack on the AES[C]//Proceedings of the 7th Cryptographers'Track at the RSA Conference on Topics in Cryptology.Berlin, Germany: Springer, 2007: 271-286.
( 0)
|
| [2] |
GULMEZOGLU B, INCI M, IRAZOKI G, et al. Cross-VM cache attacks on AES[J]. IEEE Transactions on Multi-scale Computing Systems, 2017, 2(3): 211-222. ( 0)
|
| [3] |
LIPP M, GRUSS D, SPREITZER R, et al. ARMageddon:last-level Cache attacks on mobile devices[J]. Mundo Electrónico, 2015, 6(1): 60-65. ( 0)
|
| [4] |
陈财森, 王韬, 郭世泽, 等. 针对RSA算法的踪迹驱动数据Cache计时攻击研究[J]. 计算机学报, 2014, 37(5): 1039-1051. ( 0)
|
| [5] |
KIZHVATOV I, TUNSTALL M.Improved trace-driven Cache-collision attacks against embedded AES imple-mentations[C]//Proceedings of International Conference on Information Security Applications.Berlin, Germany: Springer, 2010: 243-257.
( 0)
|
| [6] |
赵新杰, 王韬, 郭世泽, 等. AES访问驱动Cache计时攻击[J]. 软件学报, 2011, 22(3): 572-591. ( 0)
|
| [7] |
OSVIK D A, SHAMIR A, TROMER E.Cache attacks and countermeasures: the case of AES[C]//Proceedings of CT-RSA'06.Berlin, Germany: Springer, 2006: 1-20.
( 0)
|
| [8] |
GULLASCH D, BANGERTER E, KRENN S.Cache games-bringing access-based Cache attacks on AES to practice[C]//Proceedings of 2011 IEEE Symposium on Security and Privacy.Washington D.C., USA: IEEE Press, 2011: 490-505.
( 0)
|
| [9] |
IRAZOQUI G, INCI M S, EISENBARTH T, et al.Wait a minute!a fast, Cross-VM attack on AES[M]//STOLFO S J, STAVROU A, WRIGHT C V.Research in attacks, intrusions and defenses.Berlin, Germany: Springer, 2014.
( 0)
|
| [10] |
ZHOU Ping, WANG Tao, LOU Xiaoxuan, et al. Efficient Flush-Reload Cache attack on scalar multi-plication based signature algorithm[J]. Science China(Information Sciences), 2018, 61(3): 039102. ( 0)
|
| [11] |
GRUSS D, SPREITZER R, MANGARD S.Cache template attacks: automating attacks on inclusive last-level Caches[C]//Proceedings of Usenix Conference on Security Symposium.San Diego, USA: USENIX Association, 2015: 897-912.
( 0)
|
| [12] |
GRUSS D, MAURICE C, WAGNER K.Flush+Flush: a stealthier last-level Cache attack[EB/OL].[2018-03-20].https://arxiv.org/pdf/1511.04594.pdf.
( 0)
|
| [13] |
LIPP M, SCHWARZ M, GRUSS D, et al.Meltdown: reading kernel memory from user space[EB/OL].[2018-03-20].https://meltdownattack.com/meltdown.pdf.
( 0)
|
| [14] |
KOCHER P, GENKIN D, GRUSS D, et al.Spectre attacks: exploiting speculative execution[EB/OL].[2018-03-20].https://arxiv.org/pdf/1801.01203.pdf.
( 0)
|
| [15] |
LIU Fangfei, YAROM Y, GE Qian, et al.Last-level Cache side-channel attacks are practical[EB/OL].[2018-03-20].http://palms.ee.princeton.edu/system/files/SP_vfinal.pdf.
( 0)
|
| [16] |
程志炜, 陈财森, 邱雪欢. 基于Flush+Reload的DES算法Cache计时攻击[J]. 计算机工程, 2018, 44(12): 169-173. ( 0)
|
2019, Vol. 45


0)