论文部分内容阅读
芯片逆向工程是指从芯片产品中获得原始设计,它通过对芯片内部电路的识别和分析,提取出芯片设计原理、结构细节等方面的知识。传统的芯片逆向工程主要建立于版图分析之上,包括打磨分解、版图提取、重建电路等过程。随着集成电路(integrated circuit,IC)工艺不断发展、芯片规模的不断增大和设计层次的不断提高,传统的基于版图提取的逆向工程难度越来越大。一方面,芯片的打磨分解工作成功的概率在不断降低;另一方面,芯片的原始设计处于较高抽象层次,从门级电路中恢复出高层次原始设计的难度也不断增大,新的逆向技术亟待研究。为进行芯片的制造后测试工作,可测试性设计(design for testability,Df T)已经成为芯片设计中不可或缺的一部分。扫描链作为Df T的最佳实现得到了广泛的应用,其为每个寄存器提供了一个访问通道。然而,不受保护的扫描链也使得攻击者可以获取芯片内部触发器的状态。使用扫描链获取内部信息的攻击称为基于扫描的旁路攻击(也称扫描旁路攻击)。内部寄存器数据中所蕴含的语义信息可以极大地帮助逆向工程。但是,由于扫描攻击只能获取寄存器的数据而无电路的结构信息,因此很难从扫描链中识别到有用的寄存器。为了从海量的寄存器数据中挖掘出相关信息,研究者提出了许多数据分析技术。本文针对线性反馈移位寄存器(linear feedback shift register,LFSR)和计数器这两种时序电路提出了对应的分析技术。LFSR可用于流密码及一些安全认证机制,而计数器是重要的控制单元。因此,针对它们的寄存器数据分析技术也对芯片逆向工程有很大的帮助。目前,已有不少基于扫描旁路攻击对包含LFSR的安全芯片展开攻击的相关研究,但其主要关注于通用的加密芯片,其可以从外部输入特定的密钥和明文。此外,也有研究者针对LFSR展开了扫描旁路攻击研究工作,通过分析寄存器之间的内在关联,实现了对LFSR的识别工作。然而,该工作缺乏对部分LFSR的攻击研究,而且部分的攻击细节缺乏实现。此外,部分攻击工作需要攻击者猜测出一定的信息,因此针对LFSR的攻击需要进一步完善。对计数器的攻击工作主要基于门级网表,因此在无法获得门级网表时无法实现。基于扫描旁路攻击逆向工程的第一步是获取寄存器的连续数据。本文提出一种基于全扫描链的数据收集方案。全扫描设计将每个触发器转换为扫描触发器(scannable flip-flop,SFF)。全扫描链具有两种工作模式,一种是正常模式,另一种是测试模式。在正常模式下,SFF按照设计连接到正确的电路并工作。在测试模式下,SFF形成一个移位寄存器,因此可以通过扫描链的移位操作来写入和读取SFF中的数据。全扫描链添加了三个额外的端口用于访问和控制SFF形成的移位寄存器。第一个是扫描输入(scan input,SI),用于将数据输入到扫描链中。第二个是扫描输出(scan output,SO),以输出扫描链中的数据。第三个是测试控制(test control,TC)信号,用于控制扫描链的工作模式。在我们的数据收集方案中,扫描链将不断地切换模式来实现数据收集,并将SI和SO相连构成一个循环移位寄存器以实现连续数据收集。假设芯片中扫描链的长度为n,扫描链首先在正常模式下工作一个时钟,电路将产生正常的寄存器数据。然后,扫描链在测试模式下工作n个时钟,从而将寄存器数据输出到SO。同时由于SI与SO相连,输出的数据将会重新输入到SFF中,寄存器将恢复到模式切换之前的状态。重复上述步骤,就可以收集到所有寄存器的连续工作数据。LFSR是一种用于生成伪随机序列的硬件结构,具有较好的随机性与较长的周期,而LFSR的快速生成速度和可重复性性使得其在安全领域有重要的应用。由于其可以利用初始状态和特征多项式进行描述,LFSR的逆向技术的最终目的是给出初始状态和特征多项式。该目标可分为两个部分:通过分析扫描数据识别LFSR寄存器,利用寄存器数据重建LFSR的电路结构,即特征多项式。针对不同的LFSR的类型,具体的扫描攻击方法也有一些不同。本文探讨了标准Fibonacci LFSR和Galois LFSR的每对寄存器之间的关系。由于标准Fibonacci LFSR的寄存器形成了标准移位寄存器,因此可以利用移位关系来识别Fibonacci LFSR寄存器。提出了一种检验两个寄存器是否服从移位关系的sr-match算法;提出了一种识别所有Fibonacci LFSR寄存器并给出寄存器顺序的sr-search算法;提出了一种改进的fast-sr-search算法来加速识别过程。由于Galois LFSR的寄存器之间可能存在异或门,因此上述方法不适用于Galois LFSR。由于Galois LFSR的第一位和最后一位寄存器之间是直接相连的,sr-search算法可以给出Galois LFSR的首尾寄存器。由于Galois LFSR下一位的值由前一位和最后一位决定,因此Galois LFSR的每一位的可能值都可以计算得到,以此实现了Galois LFSR的识别。提出了用于检查寄存器是否为Galois LFSR的下一位的galo-match算法;提出了一个完整的包含查找首位两个寄存器以及通过galo-match查找所有寄存器的galo-search算法;提出了一种改进的fast-galo-search算法以加速该识别过程。针对Fibonacci LFSR的重建问题,我们将其转换为一个求解线性方程组的问题,对于大多数的LFSR,方程组的大小不会对求解问题带来困难。而Galois LFSR的电路结构已在识别过程中给出。针对具有单个外部输入的LFSR,探讨了LFSR寄存器之间的关系。对于具有单个外部输入的Fibonacci LFSR,由于外部输入并不会改变LFSR内部寄存器之间的关系,因此此前所提出的算法sr-search和fast-sr-search仍然适用。然而对于具有单个外部输入的Fibonacci LFSR的重建问题,我们需要假设该外部输入应存在于寄存器中,因此我们可以恢复出原始的反馈数据,从而将该问题转化为普通Fibonacci LFSR的重建问题。对于具有单个外部输入的Galois LFSR,我们发现可以通过对两个带反馈的寄存器进行异或操作来消除外部输入的影响。通过异或操作推断出反馈电路的输出,从而将该识别问题简化为普通的Galois LFSR识别问题,利用所提出的算法galo-search和fast-galo-search来解决该问题。上述过程用galo-search-input算法进行了实现。针对具有非工作状态的LFSR进行了分析,并归纳为两种情况:LFSR在较长时间的连续运行后停止工作,寄存器状态保持不变或复位或复用为其他电路;以及LFSR处于断续运行。对于前者,需要找到LFSR正常运行的时钟来展开扫描攻击。由于LFSR寄存器一般较多,可以假设设计中的移位寄存器主要是Fibonacci LFSR寄存器。因此,可以通过检查存在移位关系的寄存器数量来识别LFSR运行的时钟。如果某段连续的时钟周期内满足以为关系的寄存器数量持续较高,则可认为在该段周期内,LFSR持续运行。在发现该周期之后,我们可以从扫描数据提取出该周期对应的数据从而得到包含LFSR连续运行的寄存器数据。此时,我们可以应用之前提出的sr-search和fast-sr-search算法来识别具体的LFSR寄存器并推断出电路结构。而Galois LFSR由于仅有部分寄存器是移位寄存器,该假设不在成立,上述方法不适用于Galois LFSR。此外该方法也不适用于间断运行的情况。提出了一种基于检验寄存器数据满足移位关系的概率的方法。通过检查两个寄存器之间符合移位关系的时钟数对总时钟数的比例,可以直接识别该寄存器是否为Fibonacci LFSR寄存器。具有移位关系的两个寄存器在断续运行的情况下执行位移关系的时钟数会显著高于其他寄存器。因此,在断续运行的情况下Fibonacci LFSR寄存器可以被识别到。此时,非LFSR运行时刻的数据可以被剔除,余下的数据可以用来推断电路结构。对于Galois LFSR,利用针对Fibonacci LFSR的方法找到首尾两位寄存器以及LFSR运行的时刻,对扫描数据进行整理剔除非LFSR运行时刻的数据。然后利用galo-search和fast-galo-search进行寄存器识别和重建工作。通过探讨计数器寄存器数据的特点研究了针对计数器的扫描攻击。二进制计数器的每一位在运行会以不同的频率翻转,各个频率之间存在倍数关系。提出了一种基于翻转频率的二进制计数器寄存器检测方法。为了提高性能,提出了一种基于翻转次数的初筛方法来剔除大多数非计数器寄存器。利用二进制计数器高位翻转时低位必然翻转的特点,提出了一种基于翻转时刻对齐检查的方法以区分多个二进制计数器。为了识别存在暂停状态的二进制计数器,提出了一种基于寄存器之间翻转频率关系的方法来消除暂停状态的影响,并识别出寄存器。由于该方法对计数器停止时刻有要求,为进一步提高效果,利用计数器的语义信息提出了一种基于模式匹配的方法。通过检查每对寄存器的数据是否符合计数器的跳转规则,实现了对二进制计数器寄存器的识别,计数器可在加、减、暂停三个模式之间任意切换,且对切换频率时刻均无要求。该方法也适用于格雷码计数器、8421BCD计数器等截断二进制计数器的识别。由于环形计数器和约翰逊计数器属于一种特殊的移位寄存器,其可以通过Fibonacci LFSR的识别方案来识别。