system: [SYSTEM]

user: 3. 同步攻击 AES攻击 AES执行过程中对各个Table的查表操作是对其进行Cache攻击的切入点，对于相同的密钥k，对于不同的明文p进行加密时，根据计算，会访问到各个Table中不同索引位置，如果Cache中没有缓存相应位置的数据时，会将该数据以及其周围的数据加载到其内存所对应的Cache Set的某一个line中，加载的数据块大小与Cache line大小相等。本文针对Lenovo k51c78测试机进行实验，其Cache line大小为64字节，Table中的每项数据为4字节。加密过程中每次访问Table中的数据时，会将其周围共16个数据项加载到同一个Cache line中。因此，如果T 0 中起始数据所在内存对应Cache中某一Set a中某一Cache line的起始位置，则T 0 中索引前16项的数据都将映射到Set a中，而索引第16至第32项数据将映射到Set a + 1中，Table中索引为i的数据将映射到的 Set索引为a + (i/16)。 攻击程序通过对自身内存进行访问，能够获取到其他程序使用Cache的情况。在攻击过程中，通过Moritz Lipp et al. [ 11 ] 介绍的Prime + Probe攻击方式，其中Prime + Probe为Cache攻击的基本策略之一，其分为两个步骤：Prime阶段通过读取能够映射到某个Set中的数据将该Set中之前的数据驱逐到内存中，Probe阶段则监测Prime阶段读取的数据是否还缓存在Cache中。 因此，攻击程序首先通过Prime方法读取其内存空间的数据占用Cache中指定Set中的所有line，然后调用AES加密程序，待加密程序执行完毕之后，执行Probe方法，根据Probe访问时间判断Prime阶 Table 2 Evicting Algorith 驱逐算法： 输入： N：Cache Set的line数 D：每个循环访问的地址数 A：每个地址的访问次数 输出：无 for i = 0; i < N – D; i++ do for j = 0; j < A; j++ do for k = 0; k < D; k++ do Access(i + k)访问第i + k个相关地址 end for end for end for 表2. 驱逐策略算法 段读取的数据是否还保存在Cache中。若均还在Cache中，则表示AES加密过程中的多轮查表操作没有访问到能够映射到该Set的数据。反之，若Probe阶段探测到之前读取的数据不在Cache中，则表明AES加密过程中的某一轮查表操作或其他访存操作访问到了能够映射到该Set的数据。为了简化攻击操作，假设AES加密过程中除了查表操作外不存在其他访存操作。因此，假设已知AES中各个索引表的起始地址对应的Cache Set索引，当攻击程序同时对Cache中的所有Set进行监控时，就能够监测到AES加密过程中访问了T 0 、T 1 、T 2 、T 3 中哪些区域的数据。 为了方便讨论，本文将以目标机Lenovo k51c78为例，讨论以其作为被攻击设备，设计针对AES加密算法的攻击的方案。该目标机的L2 Cache大小为512KB，及共有512个Set，Cache组织为16路组相联。因此每个Set共有16个Cache line，每个Cache line能缓存64字节的数据。被攻击的AES加密程序有T 0 、T 1 、T 2 、T 3 4个主要的索引表，其中每个索引表包含256个数据项，可将其视为有256个元素的数据，其中每个数据项为4字节，并且假设已知索引表的首地址a对应的Cache Set索引i，为了方便讨论，假设a的取值满足a%64 = 0，表示索引table的首地址映射到Cache line的起始位置，效果如图2所示。因此，能够求得索引表中任意索引位置n对应的Cache Set位置，其表示当该位置数据被访问时其将被缓存的Cache Set号。由于攻击程序通过Prime + Probe只能探测到被攻击程序访问Cache Set的情况，并不能区分访问了Cache Set中哪些line，更不能获取Cache line中偏移的情况，因此通过Prime + Probe攻击程序并不能区分对索引表T 0 中索引0到索引15数据项的访问(对0到15项的任意一项的访问都将一整块的数据缓存到了Cache中)。 本文设计通过假设验证的方式来实现获取AES密钥，其破解过程分为两轮，第一轮获取密钥中每个字节的前4位，称为第一轮攻击，第二轮获取密钥中每个字节的后四位，称为第二轮攻击。 第一轮攻击 第一轮攻击首先计算出AES加密过程中第一轮的查表索引，结合AES内存空间中各个查表索引Table 图2. AES索引表与Cache映射情况 的首地址，计算得到对AES进行攻击时需要检测的Cache Set。本文的实验中假设AES加密明文为p，密钥为k，并假设T 0 、T 1 、T 2 、T 3 的首地址对应的Cache Set号为 s 0 、 s 1 、 s 2 、 s 3 ，因此可以计算得到 第一轮需要监测Cache Set号： s 0 + ( p 0 ⊕ k ^ 0 ) / 16 、 s 0 + ( p 4 ⊕ k ^ 4 ) / 16 、 s 0 + ( p 8 ⊕ k ^ 8 ) / 16 、 s 0 + ( p 12 ⊕ k ^ 12 ) / 16 、 s 1 + ( p 1 ⊕ k ^ 1 ) / 16 、 s 1 + ( p 5 ⊕ k ^ 5 ) / 16 、 s 1 + ( p 9 ⊕ k ^ 9 ) / 16 、 s 1 + ( p 13 ⊕ k ^ 13 ) / 16 、 s 2 + ( p 2 ⊕ k ^ 2 ) / 16 、 s 2 + ( p 6 ⊕ k ^ 6 ) / 16 、 s 2 + ( p 10 ⊕ k ^ 10 ) / 16 、 s 2 + ( p 14 ⊕ k ^ 14 ) / 16 、 s 3 + ( p 3 ⊕ k ^ 3 ) / 16 、 s 3 + ( p 7 ⊕ k ^ 7 ) / 16 、 s 3 + ( p 11 ⊕ k ^ 11 ) / 16 、 s 3 + ( p 15 ⊕ k ^ 15 ) / 16 。 在获得第一轮攻击访问的Cache Set之后，通过攻击程序检测这些Set的访问情况。首先，通过Prime操作占用指定的Set，然后执行AES加密算法，最后通过Probe测量时间判断Prime阶段读入的数据是否还在Cache中。由于单次实验获取的时间作为度量分会映入计时方式导致的误差，因此可以针对每个明文进行多次实验，最后取平局值或通过KS检验与Cache hit情况下的时间进行度量。 本文通过假设检验方式破解用户密钥，首先假设密钥的取值，然后根据密钥的假设值以及明文计算得到一组访问索引，对索引进行计算可以得到对应的Cache Set访问索引，最后通过对这组Set进行监测，判断其在AES算法执行过程中的访问情况。本文在进行第一轮攻击的验证过程中，假设密钥k为k = (0 × 00， 0 × 11， 0 × 22， 0 × 33， 0 × 44， 0 × 55， 0 × 66， 0 × 77， 0 × 00， 0 × 11， 0 × 22， 0 × 33， 0 × 44， 0 × 55， 0 × 66， 0 × 77)，根据第一轮攻击方式对其进行攻击获取密钥如图3、图4所示。 图3、图4中从左到右从上到下表示密钥k第0字节到第15字节的攻击结果，图中横坐标表示密钥字节前4位的假设值，纵坐标表示可疑度的高低，其中可疑度越高表示可能性越大，因此，本轮攻击得到的密钥的每个字节的前四位为：(0 × 0， 0 × 1， 0 × 2， 0 × 3， 0 × 4， 0 × 5， 0 × 6， 0 × 7， 0 × 0， 0 × 1， 0 × 2， 0 × 3， 0 × 4， 0 × 5， 0 × 6， 0 × 7)。可见第一轮攻击能够获取到密钥所有字节的前4位。 第二轮攻击 第二轮攻击过程与第一轮攻击过程类似，同样适用假设检验的方法。通过计算可以得到AES在第二轮中的访问索引如表3所示。 在进行攻击的过程中，首先将第一轮攻击的结果带入到假设的密钥 k ^ 中，并结合表3，然后通过假设检验的方式分组对密钥字节的后四位进行假设，并确保假设值能够遍历密钥的取值空间。通过同时假设 k 0 ， k 5 ， k 10 ， k 15 后四位的取值就能得到访问索引 n 2 ，通过对 k 3 ， k 4 ， k 9 ， k 14 同时进行假设就能够得到访问索引 n 5 ，通过对 k 2 ， k 7 ， k 8 ， k 13 同时进行假设，就能得到访问索引 n 8 ，通过同时对 k 1 ， k 6 ， k 11 ， k 12 的后四位进行假设就能够得到访问索引 n 15 。 与第一轮攻击相同，在获取到AES查表索引后就能计算得到在执行Cache攻击中需要监测的Cache Set号。在攻击过程中，首先假设密钥值为 k ^ ，当对明文p进行加密时，通过计算得到访问的Cache Set号。然后攻击程序通过Prime + Probe检测该Set的访问情况，为了降低偶然因素对实验结果的影响，检测过程执行多次，最后通过KS检验将其与一组模板样本进行比对，最后得到该密钥 k ^ 的可疑度，其中模板样本中的数据为所有检测的地址都Cache命中的时间。其中KS检验为假设检验中的一种，可以判断两个分布是否为同一个分布，其返回0到1的值，越靠近0表示两个分布越相似。 与第一轮攻击相同，第二轮攻击使用假设检验的办法，并引入KS检验降低实验误差。本文实验设置密钥k为(0 × 00， 0 × 11， 0 × 22， 0 × 33， 0 × 44， 0 × 55， 0 × 66， 0 × 77， 0 × 00， 0 × 11， 0 × 22， 0 × 33， 0 × 44， 0 × 55， 0 × 66， 0 × 77)，由于第一轮攻击获取了每个密钥字节的前4位，因此还有16 * 4位数据等待获取。通过本节介绍的方法，获取得到的结果如表4、表5、表6、表7所示。 以上各图表示Cache攻击第二轮攻击的结果，其中每个表的每一行的前4项表示假设密钥字节组合， 图3. AES第一轮攻击前8字节结果 图4. AES第一轮攻击后8字节结果 Table 3 The indices of AES in second roun n 2 = s ( p 0 ⊕ k 0 ) ⊕ s ( p 5 ⊕ k 5 ) ⊕ 2 ⋅ s ( p 10 ⊕ k 10 ) ⊕ 3 ⋅ s ( p 15 ⊕ k 15 ) ⊕ s ( k 15 ) ⊕ k 2 n 5 = s ( p 4 ⊕ k 4 ) ⊕ 2 ⋅ s ( p 9 ⊕ k 9 ) ⊕ 3 ⋅ s ( p 14 ⊕ k 14 ) ⊕ s ( p 3 ⊕ k 3 ) ⊕ s ( k 14 ) ⊕ k 1 ⊕ k 15 n 8 = 2 ⋅ s ( p 8 ⊕ k 8 ) ⊕ 3 ⋅ s ( p 13 ⊕ k 13 ) ⊕ s ( p 2 ⊕ k 2 ) ⊕ s ( p 7 ⊕ k 7 ) ⊕ s ( k 13 ) ⊕ k 0 ⊕ k 4 ⊕ k 8 ⊕ 1 n 15 = 3 ⋅ s ( p 12 ⊕ k 12 ) ⊕ s ( p 1 ⊕ k 1 ) ⊕ s ( p 6 ⊕ k 6 ) ⊕ 2 ⋅ s ( p 11 ⊕ k 11 ) ⊕ s ( k 12 ) ⊕ k 15 ⊕ k 3 ⊕ k 7 ⊕ k 11 表3. AES第二轮访问索引 Table 4 The result of ( k 0 ， k 5 ， k 10 ， k 15 ) in second roun k 0 后四位取值 k 5 后四位取值 k 10 后四位取值 k 15 后四位取值 度量分 13 3 2 5 0.952152 1 4 10 8 0.952174 8 15 10 15 0.952371 8 5 8 9 0.952374 1 15 0 3 0.9524125 7 4 4 5 0.952766 0 5 2 7 0.9533185 表4. 第二轮攻击结果 ( k 0 ， k 5 ， k 10 ， k 15 ) Table 5 The result of ( k 4 ， k 9 ， k 14 ， k 3 ) in second roun k 4 后四位取值 k 9 后四位取值 k 14 后四位取值 k 3 后四位取值 度量分 10 4 8 10 0.9384495 4 7 6 11 0.9384925 1 13 0 1 0.938506 9 6 12 15 0.9385945 13 0 8 12 0.938629 2 14 10 6 0.938634 4 1 6 3 0.938652 表5. 第二轮攻击结果 ( k 4 ， k 9 ， k 14 ， k 3 ) Table 6 The result of ( k 8 ， k 13 ， k 2 ， k 7 ) in second roun k 8 后四位取值 k 13 后四位取值 k 2 后四位取值 k 7 后四位取值 度量分 4 8 7 11 0.9570985 11 7 12 15 0.95713 14 14 5 11 0.9571695 8 1 12 2 0.9572065 14 3 8 2 0.9572265 4 7 14 8 0.9574545 0 5 2 7 0.9578595 表6. 第二轮攻击结果 ( k 8 ， k 13 ， k 2 ， k 7 ) 比如表4中最后一行表示假设 ( k 0 ， k 5 ， k 10 ， k 15 ) 的值为 ( 0 ， 5 ， 2 ， 7 ) ，最后一列表示该组合的度量分，其中度量分数表示同一行4个密钥组合的可疑度，可疑度越高表示该行的密钥组合为真实的密钥值的可能性越高，因此可疑度最高的行就是Cache攻击估计的结果。可见 ( k 0 ， k 5 ， k 10 ， k 15 ) 每个字节后四位取值为 ( 0 ， 5 ， 2 ， 7 ) 的可疑度为0.9533185，由于每4个字节后四位组合共有65，536种可能性，因此表中仅仅列出可疑度最高的7中组合。其中每个表中可疑度最高的组合就是攻击结果，因此可以获得AES每个字节的 Table 7 The result of ( k 12 ， k 1 ， k 6 ， k 11 ) in second roun k 12 后四位取值 k 1 后四位取值 k 6 后四位取值 k 11 后四位取值 度量分 4 15 3 14 0.830743 1 9 6 10 0.8309515 5 15 0 12 0.8312265 7 14 5 3 0.831524 4 1 12 4 0.8315825 14 4 9 12 0.831855 4 1 6 3 0.8327175 表7. 第二轮攻击结果 ( k 12 ， k 1 ， k 6 ， k 11 ) 后四位为(0 × 0， 0 × 1， 0 × 2， 0 × 3， 0 × 4， 0 × 5， 0 × 6， 0 × 7， 0 × 0， 0 × 1， 0 × 2， 0 × 3， 0 × 4， 0 × 5， 0 × 6， 0 × 7)，与第一轮攻击获取的前4位组合起来得到攻击结果 k ^ =(0 × 00， 0 × 11， 0 × 22， 0 × 33， 0 × 44， 0 × 55， 0 × 66， 0 × 77， 0 × 00， 0 × 11， 0 × 22， 0 × 33， 0 × 44， 0 × 55， 0 × 66， 0 × 77)，与设置的密钥k相同，因此成功获取了全部密钥信息。