CPU程序的安全加固方法、装置转让专利

申请号 : CN201910251029.X

文献号 : CN110059454B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 不公告发明人

申请人 : 网御安全技术(深圳)有限公司

摘要 :

本发明涉及了一种CPU程序的安全加固方法、装置,该安全加固方法包括:获取CPU中指令地址寄存器的输出数据,并将其作为上一指令地址暂存至上一指令地址寄存器中;将上一指令地址寄存器中的上一指令地址与CPU中指令地址寄存器中的当前指令地址进行比较,并判断当前指令地址与上一指令地址的关系是否为非递增,若是,则判断CPU中指令地址寄存器中的当前指令地址是否存在于预设的地址集合中,若否,则确定CPU程序跑飞,其中,所述地址集合包括CPU程序中所有顺序指令段的入口地址、中断入口地址、以及中断服务程序中所有顺序指令段的入口地址。实施本发明的技术方案,可提升程序跳转检测的覆盖范围和完备性,而且,大大提升了程序跑飞检测的响应速度。

权利要求 :

1.一种CPU程序的安全加固方法,其特征在于,包括以下步骤:

步骤S10.获取CPU中指令地址寄存器的输出数据,并将其作为上一指令地址暂存至上一指令地址寄存器中,从CPU中获取指令顺序执行标识,并将其暂存至指令顺序执行标识寄存器中,而且,从中断优先级判断电路获取中断使能信号;

步骤S20.将上一指令地址寄存器中的上一指令地址与CPU中指令地址寄存器中的当前指令地址进行比较,并判断当前指令地址与上一指令地址的关系是否为非递增,若是,则执行步骤S30;

步骤S30.在所述指令顺序执行标识为真,且中断使能信号为假时,确定CPU程序跑飞;

在指令顺序执行标识为假,或,指令顺序执行标识为真且中断使能信号为真时,判断CPU中指令地址寄存器中的当前指令地址是否存在于预设的地址集合中,若否,则确定CPU程序跑飞,其中,所述地址集合包括CPU程序中所有顺序指令段的入口地址、中断入口地址、以及中断服务程序中所有顺序指令段的入口地址。

2.根据权利要求1所述的CPU程序的安全加固方法,其特征在于,在所述步骤S30之后,还包括:

步骤S40.在确定CPU程序跑飞时,通过回溯到当前的顺序指令段或之前的其中一个顺序指令段来恢复CPU程序的执行现场。

3.根据权利要求2所述的CPU程序的安全加固方法,其特征在于,在所述步骤S30中,若所述当前指令地址存在于预设的地址集合中,则将所述当前指令地址写入跳转地址寄存器中;所述步骤S40包括:在确定CPU程序跑飞时,触发CPU程序产生中断,以使CPU中指令地址寄存器从所述跳转地址寄存器中读数据。

4.根据权利要求2所述的CPU程序的安全加固方法,其特征在于,在所述步骤S30中,若所述当前指令地址存在于预设的地址集合中,则将第i跳转地址寄存器的数据写入第i+1个跳转地址寄存器中,并将当前指令地址写入第i个跳转地址寄存器中,其中,i=1、2、…、N-

1,N为跳转地址寄存器的数量;所述步骤S40包括:在确定CPU程序跑飞时,触发CPU程序产生中断,并从N个跳转地址寄存器中确定一个跳转地址寄存器,且使CPU中指令地址寄存器从所确定的跳转地址寄存器中读数据。

5.一种CPU程序的安全加固装置,其特征在于,包括:

指令执行状态判断模块,用于从CPU中获取指令顺序执行标识,并将其暂存至指令顺序执行标识寄存器中,而且,从中断优先级判断电路获取中断使能信号;获取CPU中指令地址寄存器的输出数据,并将其作为上一指令地址暂存至上一指令地址寄存器中,而且,将上一指令地址寄存器中的上一指令地址与CPU中指令地址寄存器中的当前指令地址进行比较,并判断当前指令地址与上一指令地址的关系是否为非递增;

跳转地址判断模块,用于在当前指令地址与上一指令地址的关系为非递增时,判断CPU中指令地址寄存器中的当前指令地址是否存在于预设的地址集合中,其中,所述地址集合包括CPU程序中所有顺序指令段的入口地址、中断入口地址、以及中断服务程序中所有顺序指令段的入口地址;

程序跑飞确定模块,用于在所述指令顺序执行标识为真,且中断使能信号为假时,确定CPU程序跑飞;还用于在指令顺序执行标识为假,或,指令顺序执行标识为真且中断使能信号为真时,若所述当前指令地址不存在于预设的地址集合中时,则确定CPU程序跑飞。

6.根据权利要求5所述的CPU程序的安全加固装置,其特征在于,还包括:程序修复模块,用于在确定CPU程序跑飞时,通过回溯到当前的顺序指令段或之前的其中一个顺序指令段来恢复CPU程序的执行现场。

7.根据权利要求6所述的CPU程序的安全加固装置,其特征在于,所述程序修复模块,用于在所述当前指令地址存在于预设的地址集合中时,将所述当前指令地址写入跳转地址寄存器中;还用于在确定CPU程序跑飞时,触发CPU程序产生中断,以使CPU中指令地址寄存器从所述跳转地址寄存器中读数据。

8.根据权利要求6所述的CPU程序的安全加固装置,其特征在于,所述程序修复模块,用于在所述当前指令地址存在于预设的地址集合中时,将第i跳转地址寄存器的数据写入第i+1个跳转地址寄存器中,并将当前指令地址写入第i个跳转地址寄存器中,其中,i=1、

2、…、N-1,N为跳转地址寄存器的数量;还用于在确定CPU程序跑飞时,触发CPU程序产生中断,并从N个跳转地址寄存器中确定一个跳转地址寄存器,且使CPU中指令地址寄存器从所确定的跳转地址寄存器中读数据。

说明书 :

CPU程序的安全加固方法、装置

技术领域

[0001] 本发明涉及计算机领域,尤其涉及一种CPU程序的安全加固方法、装置。

背景技术

[0002] CPU在运行过程中,由于外部环境(例如电磁、电压)的干扰或者恶意攻击者故意对CPU芯片施加激光攻击、电磁信号攻击,导致CPU执行的程序偏离预定的路径,跳转到正常程序地址空间之外,执行其他非预期的操作,这种情况就称为程序跑飞。由外部环境引起的程序跑飞,会影响CPU正常功能的执行,而恶意攻击者通过攻击手段导致正常程序跑飞,则攻击者下一步的操作就是在非正常的跳转点开始执行恶意软件。因此,在CPU设计中加入防止程序跑飞的功能,对于实现CPU的安全加固具有重要的意义和作用。
[0003] CPU通过执行程序来实现相应的功能,程序按预期的路径读取指令、解释指令和执行指令是程序正确执行的基础。把程序结构展开,如图1所示,就表现为若干顺序指令段的依此执行或者跳转执行,顺序指令段的第一条指令的地址,就是该顺序指令段的入口地址,同时也是跳转指令的目标地址。以图中顺序指令段Ci为例,它的入口地址是Addr-i,同时也是跳转指令Ji的转移目标地址。因此,通过检查和校验跳转指令的目标地址,就可以知道程序是否跑飞。
[0004] 目前,通常采用软件的方法来检查跳转指令的执行是否出现了问题,即,为每一条跳转指令配置相应的hash计算,计算得到的hash值与预期值相比较,从而判断程序是否跑飞。但是,这种软件方法存在以下缺陷:
[0005] 1.只能检测已知的跳转情况,即针对程序中的跳转指令加入程序轨迹Hash值计算,而且,对于类似硬件中断等不可预知的跳转情况是无法检测的,假如攻击者利用激光、电磁等攻击方法,修改CPU中的指令地址寄存器的内容,将程序跳转到恶意软件所在的地址空间后,只要恶意软件执行完成后跳转回到原程序插入点的下一条指令地址,软件检测方案便无法检测到恶意软件的执行,因此,程序跳转检测的覆盖范围较小;
[0006] 2.对程序跑飞情况的检查依赖于各个检测点上hash值的计算和与预期值的比较,而hash值计算需要执行多条指令,比较操作的执行也需要执行多条指令,这些开销对于提升了程序跑飞检测的响应速度都是不利的;
[0007] 3.对程序跑飞的修复能力是非常有限的,在程序跑飞后,系统往往进入死循环,需要做系统复位才能恢复工作。

发明内容

[0008] 本发明要解决的技术问题在于,针对现有技术中程序跳转检测的覆盖范围较小且检测响应速度慢的缺陷,提供一种CPU程序的安全加固方法、装置。
[0009] 本发明解决其技术问题所采用的技术方案是:构造一种CPU程序的安全加固方法,包括以下步骤:
[0010] 步骤S10.获取CPU中指令地址寄存器的输出数据,并将其作为上一指令地址暂存至上一指令地址寄存器中;
[0011] 步骤S20.将上一指令地址寄存器中的上一指令地址与CPU中指令地址寄存器中的当前指令地址进行比较,并判断当前指令地址与上一指令地址的关系是否为非递增,若是,则执行步骤S30;
[0012] 步骤S30.判断CPU中指令地址寄存器中的当前指令地址是否存在于预设的地址集合中,若否,则确定CPU程序跑飞,其中,所述地址集合包括CPU程序中所有顺序指令段的入口地址、中断入口地址、以及中断服务程序中所有顺序指令段的入口地址。
[0013] 优选地,所述步骤S10还包括:
[0014] 从CPU中获取指令顺序执行标识,并将其暂存至指令顺序执行标识寄存器中,而且,从中断优先级判断电路获取中断使能信号;
[0015] 所述步骤S30包括:
[0016] 在所述指令顺序执行标识为真,且中断使能信号为假时,确定CPU程序跑飞;
[0017] 在指令顺序执行标识为假,或,指令顺序执行标识为真且中断使能信号为真时,判断CPU中指令地址寄存器中的当前指令地址是否存在于预设的地址集合中,若否,则确定CPU程序跑飞。
[0018] 优选地,在所述步骤S30之后,还包括:
[0019] 步骤S40.在确定CPU程序跑飞时,通过回溯到当前的顺序指令段或之前的其中一个顺序指令段来恢复CPU程序的执行现场。
[0020] 优选地,在所述步骤S30中,若所述当前指令地址存在于预设的地址集合中,则将所述当前指令地址写入跳转地址寄存器中;
[0021] 所述步骤S40包括:
[0022] 在确定CPU程序跑飞时,触发CPU程序产生中断,以使CPU中指令地址寄存器从所述跳转地址寄存器中读数据。
[0023] 优选地,在所述步骤S30中,若所述当前指令地址存在于预设的地址集合中,则将第i跳转地址寄存器的数据写入第i+1个跳转地址寄存器中,并将当前指令地址写入第i个跳转地址寄存器中,其中,i=1、2、…、N-1,N为跳转地址寄存器的数量;
[0024] 所述步骤S40包括:
[0025] 在确定CPU程序跑飞时,触发CPU程序产生中断,并从N个跳转地址寄存器中确定一个跳转地址寄存器,且使CPU中指令地址寄存器从所确定的跳转地址寄存器中读数据。
[0026] 本发明还构造一种CPU程序的安全加固装置,包括:
[0027] 指令执行状态判断模块,用于获取CPU中指令地址寄存器的输出数据,并将其作为上一指令地址暂存至上一指令地址寄存器中,而且,将上一指令地址寄存器中的上一指令地址与CPU中指令地址寄存器中的当前指令地址进行比较,并判断当前指令地址与上一指令地址的关系是否为非递增;
[0028] 跳转地址判断模块,用于在当前指令地址与上一指令地址的关系为非递增时,判断CPU中指令地址寄存器中的当前指令地址是否存在于预设的地址集合中,其中,所述地址集合包括CPU程序中所有顺序指令段的入口地址、中断入口地址、以及中断服务程序中所有顺序指令段的入口地址;
[0029] 程序跑飞确定模块,用于在当前指令地址不存在于预设的地址集合中时,则确定CPU程序跑飞。
[0030] 优选地,所述指令执行状态判断模块,还用于从CPU中获取指令顺序执行标识,并将其暂存至指令顺序执行标识寄存器中,而且,从中断优先级判断电路获取中断使能信号;
[0031] 程序跑飞确定模块,用于在所述指令顺序执行标识为真,且中断使能信号为假时,确定CPU程序跑飞;还用于在指令顺序执行标识为假,或,指令顺序执行标识为真且中断使能信号为真时,若所述当前指令地址不存在于预设的地址集合中,则确定CPU程序跑飞。
[0032] 优选地,还包括:
[0033] 程序修复模块,用于在确定CPU程序跑飞时,通过回溯到当前的顺序指令段或之前的其中一个顺序指令段来恢复CPU程序的执行现场。
[0034] 优选地,所述程序修复模块,用于在所述当前指令地址存在于预设的地址集合中时,将所述当前指令地址写入跳转地址寄存器中;还用于在确定CPU程序跑飞时,触发CPU程序产生中断,以使CPU中指令地址寄存器从所述跳转地址寄存器中读数据。
[0035] 优选地,所述程序修复模块,用于在所述当前指令地址存在于预设的地址集合中时,将第i跳转地址寄存器的数据写入第i+1个跳转地址寄存器中,并将当前指令地址写入第i个跳转地址寄存器中,其中,i=1、2、…、N-1,N为跳转地址寄存器的数量;还用于在确定CPU程序跑飞时,触发CPU程序产生中断,并从N个跳转地址寄存器中确定一个跳转地址寄存器,且使CPU中指令地址寄存器从所确定的跳转地址寄存器中读数据。
[0036] 实施本发明的技术方案,具有以下有益效果:
[0037] 1.由于预设的地址集合中不但包含了CPU程序中的跳转指令的跳转地址,同时也包含了中断入口地址、中断服务程序中跳转指令的跳转地址,覆盖了全部正常功能情况下的检测地址,如果出现了不在这个集合中的地址,可以准确地判断出现了程序跑飞。因此,可提升程序跳转检测的覆盖范围和完备性;
[0038] 2.在每执行一新指令时,便启动地址比较操作,检测速度与预存储地址集合的大小有关,可以保证在数个时钟节拍内完成,因此,大大提升了程序跑飞检测的响应速度。

附图说明

[0039] 为了更清楚地说明本发明实施例,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。附图中:
[0040] 图1是CPU程序的结构图;
[0041] 图2是本发明CPU程序的安全加固方法实施例一的流程图;
[0042] 图3是本发明CPU程序的安全加固方法实施例二的流程图;
[0043] 图4是本发明CPU程序的安全加固装置实施例一的逻辑结构图;
[0044] 图5是本发明CPU程序的安全加固装置实施例二的逻辑结构图;
[0045] 图6是本发明CPU程序的安全加固装置实施例三的逻辑结构图。

具体实施方式

[0046] 下面结合附图详细说明本发明的具体实施方式。
[0047] 在此记载的具体实施方式/实施例为本发明的特定的具体实施方式,用于说明本发明的构思,均是解释性和示例性的,不应解释为对本发明实施方式及本发明范围的限制。除在此记载的实施例外,本领域技术人员还能够基于本申请权利要求书和说明书所公开的内容采用显而易见的其它技术方案,这些技术方案包括采用对在此记载的实施例的做出任何显而易见的替换和修改的技术方案,都在本发明的保护范围之内。
[0048] 需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
[0049] 图2是本发明CPU程序的安全加固方法实施例一的流程图,该实施例的安全加固方法包括:
[0050] 步骤S10.获取CPU中指令地址寄存器的输出数据,并将其作为上一指令地址暂存至上一指令地址寄存器中;
[0051] 在该步骤中,CPU中指令地址寄存器中的内容为当前指令的地址,通过设置一寄存器(上一指令地址寄存器),并用该寄存器来暂存CPU中的指令地址寄存器的输出数据,这样,该寄存器用中的内容即为上一指令的地址。
[0052] 步骤S20.将上一指令地址寄存器中的上一指令地址与CPU中指令地址寄存器中的当前指令地址进行比较,并判断当前指令地址与上一指令地址的关系是否为非递增,若是,则执行步骤S30;
[0053] 在该步骤中,通过比较上一指令地址寄存器中的内容和CPU中的指令地址寄存器PC的内容,就可判断当前指令地址与上一指令地址的关系,例如为递增或为非递增,如果为递增,则说明当前指令的执行状态是顺序执行;如果未非递增,则说明当前指令的执行状态是跳转操作。
[0054] 步骤S30.判断CPU中指令地址寄存器中的当前指令地址是否存在于预设的地址集合中,若否,则确定CPU程序跑飞,其中,所述地址集合包括CPU程序中所有顺序指令段的入口地址、中断入口地址、以及中断服务程序中所有顺序指令段的入口地址。
[0055] 在该步骤中,在确定跳转操作时,需要对跳转地址(当前指令地址)的合法性进行判别。具体地,可预先设置地址集合,该地址集合包括CPU程序中所有顺序指令段的入口地址、中断入口地址、以及中断服务程序中所有顺序指令段的入口地址,从而可保证所检测的跳转地址的完整性。在进行判别时,将当前指令地址(当前写入指令地址寄存器中的跳转地址)与地址集合中的地址值进行比较,如果当前指令地址存在于该地址集合中,则说明当前的程序跳转操作是合法的,反之,则不合法,即确定CPU程序跑飞。
[0056] 该实施例的技术方案相比现有技术的软件检测方式,具有以下有益效果:
[0057] 1.由于预设的地址集合中不但包含了CPU程序中的跳转指令的跳转地址,同时也包含了中断入口地址、中断服务程序中跳转指令的跳转地址,覆盖了全部正常功能情况下的检测地址,如果出现了不在这个集合中的地址,可以准确地判断出现了程序跑飞。因此,相比现有的软件方法只检查程序自身控制流路径的完整性与合法性,无法检测与中断事件相关的执行流程的完整性与合法性,该实施例的技术方案可提升程序跳转检测的覆盖范围和完备性;
[0058] 2.在每执行一新指令时,便启动地址比较操作,检测速度与预存储地址集合的大小有关,可以保证在数个时钟节拍内完成,因此,相比现有的软件方法依赖于各个检测点上hash值的计算和与预期值的比较,该实施例的技术方案大大提升了程序跑飞检测的响应速度。
[0059] 图3是本发明CPU程序的安全加固方法实施例二的流程图,该实施例的安全加固方法相比图2所示的实施例,所不同的仅是:
[0060] 步骤S10还包括:从CPU中获取指令顺序执行标识,并将其暂存至指令顺序执行标识寄存器中,而且,从中断优先级判断电路获取中断使能信号;
[0061] 步骤S30包括:
[0062] 在所述指令顺序执行标识为真,且中断使能信号为假时,确定CPU程序跑飞;
[0063] 在指令顺序执行标识为假,或,指令顺序执行标识为真且中断使能信号为真时,判断CPU中指令地址寄存器中的当前指令地址是否存在于预设的地址集合中,若否,则确定CPU程序跑飞。
[0064] 在该实施例中,首先说明的是,通过设置一寄存器(指令顺序执行标识寄存器)来暂存CPU中PC+1选择信号,如果该信号为真,则表示上一条指令和当前指令之间是顺序执行的关系。另外,中断使能信号来自CPU中断优先级判断电路,若该信号为真,则表示当前指令的执行状态是中断服务跳转操作。该实施例在判断当前指令的执行状态时,除了根据上一指令地址与当前指令地址的比较结果,还进一步结合指令顺序执行标识及中断使能信号来判断,具体地:在上一指令地址与当前指令地址的关系为非递增的前提下,若指令顺序执行标识为假,则说明当前指令的执行状态是正常跳转操作;若指令顺序执行标识为真,且中断使能信号为真,则说明当前指令的执行状态是中断服务跳转;若指令顺序执行标识为真,且中断使能信号为假,则说明当前指令的执行状态是CPU受到恶意攻击或者受到外部执行环境的影响,导致了CPU中指令地址寄存器的内容被篡改,此时,不需要判断当前指令地址是否存在于预设的地址集合中,即可确定程序出现跑飞情况。而对于正常跳转操作及中断服务跳转操作,则需要通过判断当前指令地址是否存在于预设的地址集合中来确定CPU程序跑飞。
[0065] 本发明的CPU程序的安全加固方法,在步骤S30之后,还进一步包括:
[0066] 步骤S40.在确定程序跑飞时,通过回溯到当前的顺序指令段或之前的其中一个顺序指令段来恢复CPU程序的执行现场。
[0067] 在该实施例中,通过回溯已经成功执行的上一个顺序指令段,或,当前出现跑飞情况的当前顺序指令段,就可以恢复程序执行的现场,查找发生跑飞的原因,从而修复程序正常执行。
[0068] 在一个可选实施例中,在步骤S30中,若所述当前指令地址存在于预设的地址集合中,则将所述当前指令地址写入跳转地址寄存器中;
[0069] 所述步骤S40包括:
[0070] 在确定CPU程序跑飞时,触发CPU程序产生中断,以使CPU中指令地址寄存器从所述跳转地址寄存器中读数据。
[0071] 在该实施例中,通过设置一寄存器(跳转地址寄存器)来存储发生跑飞情况的当前执行的顺序指令段的入口地址,具体地,每次在确定程序没发生程序跑飞时,均将当前指令地址写入该寄存器中,这样,该寄存器的内容即为发生跑飞情况的当前执行的顺序指令段的入口地址。当判断出发生程序跑飞时,触发CPU程序产生中断,以使CPU中指令地址寄存器从跳转地址寄存器中读数据,这样,CPU中指令地址寄存器的内容便为发生跑飞情况的当前执行的顺序指令段的入口地址。
[0072] 在另一个可选实施例中,步骤S30中,若所述当前指令地址存在于预设的地址集合中,则将第i跳转地址寄存器的数据写入第i+1个跳转地址寄存器中,并将当前指令地址写入第i寄存器中,其中,i=1、2、…、N-1;
[0073] 所述步骤S40包括:
[0074] 在确定CPU程序跑飞时,触发CPU程序产生中断,并从N个跳转地址寄存器中确定一个跳转地址寄存器,且使CPU中指令地址寄存器从所确定的跳转地址寄存器中读数据。
[0075] 在该实施例中,可设置N个寄存器(跳转地址寄存器)来存储发生跑飞情况的当前执行的顺序指令段的入口地址及已成功执行的顺序指令段的入口地址。具体地,每次在确定程序没发生程序跑飞时,均将当前指令地址及当前指令之前的几个指令地址分别写入这些寄存器中,这样,这些寄存器的内容即为发生跑飞情况的当前执行的顺序指令段的入口地址及已成功执行的顺序指令段的入口地址。当判断出发生程序跑飞时,触发CPU程序产生中断,然后根据当前的应用从N个跳转地址寄存器中确定一个跳转地址寄存器,以使CPU中指令地址寄存器从所确定的跳转地址寄存器中读数据,这样,CPU中指令地址寄存器的内容便为发生跑飞情况的当前执行的顺序指令段的入口地址或已成功执行的其中一个顺序指令段的入口地址。
[0076] 在该实施例中,由于常规CPU电路中没有和跳转地址寄存器功能相当的寄存器,在CPU程序出现跑飞情况时,故障定位和恢复执行无法达到顺序指令段的精确度。而该实施例不但可恢复程序执行的现场,而且,查找发生跑飞的原因,从而修复程序正常执行。
[0077] 图4是本发明CPU程序的安全加固装置实施例一的逻辑结构图,该实施例的安全加固装置包括指令执行状态判断模块10、跳转地址判断模块20、程序跑飞确定模块30。其中,指令执行状态判断模块10用于获取CPU中指令地址寄存器的输出数据,并将其作为上一指令地址暂存至上一指令地址寄存器中,而且,将上一指令地址寄存器中的上一指令地址与CPU中指令地址寄存器中的当前指令地址进行比较,并判断当前指令地址与上一指令地址的关系是否为非递增。跳转地址判断模块20用于在当前指令地址与上一指令地址的关系为非递增时,判断CPU中指令地址寄存器中的当前指令地址是否存在于预设的地址集合中,其中,所述地址集合包括CPU程序中所有顺序指令段的入口地址、中断入口地址、以及中断服务程序中所有顺序指令段的入口地址。程序跑飞确定模块30用于在当前指令地址不存在于预设的地址集合中时,则确定CPU程序跑飞。
[0078] 进一步地,指令执行状态判断模块10还用于从CPU中获取指令顺序执行标识,并将其暂存至指令顺序执行标识寄存器中,而且,从中断优先级判断电路获取中断使能信号;程序跑飞确定模块30用于在所述指令顺序执行标识为真,且中断使能信号为假时,确定CPU程序跑飞;还用于在指令顺序执行标识为假,或,指令顺序执行标识为真且中断使能信号为真时,若所述当前指令地址不存在于预设的地址集合中,则确定CPU程序跑飞。
[0079] 图5是本发明CPU程序的安全加固装置实施例二的逻辑结构图,该实施例相比图4所示的实施例,所不同的仅是:还进一步包括程序修复模块40,且该程序修复模块40用于在确定CPU程序跑飞时,通过回溯到当前的顺序指令段或之前的其中一个顺序指令段来恢复CPU程序的执行现场。
[0080] 在一个可选实施例中,程序修复模块40用于在所述当前指令地址存在于预设的地址集合中时,将所述当前指令地址写入跳转地址寄存器中;还用于在确定CPU程序跑飞时,触发CPU程序产生中断,以使CPU中指令地址寄存器从所述跳转地址寄存器中读数据。
[0081] 在另一个可选实施例中,程序修复模块40用于在所述当前指令地址存在于预设的地址集合中时,将第i跳转地址寄存器的数据写入第i+1个跳转地址寄存器中,并将当前指令地址写入第i个跳转地址寄存器中,其中,i=1、2、…、N-1,N为跳转地址寄存器的数量;还用于在确定CPU程序跑飞时,触发CPU程序产生中断,并从N个跳转地址寄存器中确定一个跳转地址寄存器,且使CPU中指令地址寄存器从所确定的跳转地址寄存器中读数据。
[0082] 图6是本发明CPU程序的安全加固装置实施例三的逻辑结构图,该实施例的安全加固装置包括指令执行状态判断模块10、跳转地址判断模块20、程序跑飞确定模块(未示出)、程序修复模块40,这些模块的逻辑电路设计,既可以以RTL等源代码形式实现,也可以以集成到CPU核中以ASIC、FPGA等硬件电路的形式实现。下面分别说明每一个模块的工作过程:
[0083] 指令执行状态判断模块10的核心是两个寄存器,一个寄存器(上一指令地址寄存器)暂存CPU中的指令地址寄存器PC的输出,用来标识上一条指令的地址;另一个寄存器(指令顺序执行标识寄存器)暂存PC+1选择信号,如果该信号为真,则标识上一条指令和当前PC寄存器所访问的当前指令之间是顺序执行的关系。
[0084] 指令执行状态判断模块10对正常和异常执行情况的判断包括以下内容:
[0085] 1.通过比较上一指令地址寄存器中的内容和CPU中的指令地址寄存器PC的内容,如果两者是递增关系,同时指令顺序执行标识为真,则当前指令的执行状态是顺序执行;
[0086] 2.如果上一指令地址寄存器中的内容和CPU中的指令地址寄存器PC的内容不是递增关系,同时,指令顺序执行标识为假,则当前指令的执行状态是跳转操作,跳转地址的合法性需要通过跳转地址判断模块20进行判别;
[0087] 3.如果上一指令地址寄存器中的内容和CPU中的指令地址寄存器PC的内容不是递增关系,同时,指令顺序执行标识为真,但来自CPU中断优先级判断电路的中断使能信号为真,则当前指令的执行状态是中断服务跳转操作,跳转地址的合法性需要通过跳转地址判断模块20进行判别;
[0088] 4.如果上一指令地址寄存器中的内容和CPU中的指令地址寄存器PC的内容不是递增关系,但指令顺序执行标识为真,同时,CPU中断优先级判断电路的中断使能信号为假,则当前指令的执行状态是CPU受到恶意攻击或者受到外部执行环境的影响,导致了CPU中的指令地址寄存器的内容被篡改,程序出现跑飞情况。
[0089] 跳转地址判断模块20的核心是比较器及预存储跳转地址的集合,该集合中保存了程序所对应的顺序指令段的全部入口地址、中断入口地址、以及中断服务程序代码中的顺序指令段的全部入口地址,保证了所检测的跳转地址的完整性。
[0090] 比较器将写入CPU中指令地址寄存器中的跳转地址和预存储的地址集合中的地址值进行比较,如果当前写入CPU中的指令地址寄存器中的跳转地址在该集合中,则证明当前的程序跳转操作是合法的,同时将该地址值写入到程序修复模块40中的当前跳转地址寄存器中进行保存;否则,如果当前写入CPU中的指令地址寄存器中的跳转地址不在预存储的地址集合中,则是程序发生了跑飞的情况,该地址值不会写入到程序修复模块40中的当前跳转地址寄存器中进行保存。
[0091] 程序修复模块40的核心是当前跳转地址寄存器和上一次跳转地址寄存器。在确定发生了跑飞的情况时,即当前写入CPU中的指令地址寄存器中的跳转地址不在预存储的地址集合中时,当前跳转地址寄存器中存储的是发生跑飞情况的当前执行的顺序指令段的入口地址,而上一次跳转地址寄存器中则保存了调用当前顺序指令段的已成功执行的顺序指令段的地址。通过回溯已经成功执行的上一个顺序指令段,或当前出现跑飞情况的当前顺序指令段,就可以恢复程序执行的现场,查找发生跑飞的原因,从而修复程序正常执行。
[0092] 本发明的程序跑飞的检测和修复的解决方案与目前使用的软件方法的方案相比,由于采用了硬件电路的方式来实现程序跑飞情况的快速检测,并利用硬件电路来实现程序跑飞状态的快速修复,可以达到下列技术效果:
[0093] 1.实现了程序跳转检测的覆盖范围的完备性
[0094] 硬件检测方法在跳转地址判断模块的预存储的地址集合中不但包含了程序中的跳转指令的跳转地址,同时也包含了中断入口地址、中断程序中跳转指令的跳转地址,覆盖了全部正常功能情况下的检测地址,如果出现了不在这个集合中的地址,可以准确地判断为出现了程序跑飞。
[0095] 2.提升了程序跑飞检测的响应速度
[0096] 硬件检测方案的指令执行状态判断模块中PC+1选择信号的暂存写入的同时就启动了地址比较操作,检测速度与预存储跳转地址集合的大小有关,通过合理的缓存硬件设计,可以保证在数个时钟节拍内完成,和软件检测方法相比,大大提升了程序跑飞检测的响应速度。
[0097] 3.提升了程序跑飞的修复速度
[0098] 硬件修复方案在检测出跑飞情况时,程序修复模块中的当前跳转地址寄存器中存储的是当前执行的顺序指令段的入口地址,而上一次跳转地址寄存器中则保存了调用当前顺序指令段的已成功执行的顺序指令段的地址。通过回溯已经成功执行的上一个顺序指令段,以及当前出现跑飞情况的当前顺序指令段,就可以恢复程序执行的现场,查找发生跑飞的原因,从而修复程序,转入正常执行。
[0099] 以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何纂改、等同替换、改进等,均应包含在本发明的权利要求范围之内。