首页> 中国专利> 运行时程序安全关键数据的完整性验证方法及装置

运行时程序安全关键数据的完整性验证方法及装置

摘要

本发明公开了一种运行时程序安全关键数据的完整性验证方法及装置,方法步骤如下:1)在程序中指明安全关键变量,在编译时生成安全关键数据集合,加载程序时将程序的虚拟地址空间分为保护区域和非保护区域、将安全关键数据集合加载至保护区域内,为程序保护区域的虚拟页构造完整性验证树;2)在向内存写入程序数据时,更新根验证值;在从内存中读取程序数据时,生成新的根验证值,并将新的根验证值与原根验证值进行比较,如果两者相等则判定安全关键数据集合未被篡改,否则判定安全关键数据集合已经被篡改;装置包括数据完整性验证电路、根验证值存储模块、比较器。本发明具有安全性能高、防攻击性能强、运算量小、占用存储空间少的优点。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-07-29

    授权

    授权

  • 2013-03-20

    实质审查的生效 IPC(主分类):G06F21/10 申请日:20121128

    实质审查的生效

  • 2013-02-13

    公开

    公开

说明书

技术领域

本发明涉及计算机安全领域,具体涉及一种运行时程序安全关键数据的完整性验证方法及装置。

背景技术

在计算机系统中,可假设处理器芯片可以防御各类物理攻击,是安全可信的。但是位于处理器之外的内存和片外总线可能遭受物理攻击。攻击者可以破坏内存中的数据,也可以破坏在总线上传输的数据。例如其他连接在片外总线上,可以直接对内存进行读写的主设备,都可以成为攻击者。如图1所示,位于处理器之外的内存和片外总线可能遭受物理攻击的攻击类型主要有三类:欺骗攻击(a),换位攻击(b)和重放攻击(c)。欺骗攻击指的是攻击者将某个内存数据块用伪造的数据块(被篡改的数据)代替;换位攻击指的是攻击者使用地址A的数据块<Data @2>替换地址B的数据块<Data @4>;重放攻击指的是攻击者用地址A之前的旧数据<Data(@4,t1)>替换地址A当前存储的数据<Data(@4,t2)>。

针对单处理器的内存完整性验证,国际上有很多研究,现有工作都是基于上述假设,认为处理器是可信的,信任边界包括处理器内部的计算和存储单元,即处理器和片上cache。现有技术的内存完整性保护方法主要有如下几种:

1、最直接的内存完整性保护方法的步骤如下:

第一步,对整个片外存储器的内容计算摘要值。

第二步,将计算得到的摘要值存储在可信区域中(如处理器芯片中)。

第三步,当从内存中读出数据块的时候,重新计算整个内存的摘要值,和处理器上保存的摘要值进行比较,如果相等,数据完整性未被篡改,如果不相等,则数据已被篡改。

第四步,当数据写入内存时,如果经过处理器确认修改合法,则可以执行,同时重新计算整个内存芯片的摘要值,并更新处理器芯片中保存的摘要值。

但是此类方法的摘要运算量和访存带宽太大,可用性差。

2、另外一类内存完整性保护方法的步骤如下:

第一步,将内存分块,为每个内存块计算一个摘要值。

第二步,将所有的内存数据块的摘要值保存在可信区域中(如处理器芯片中)。

第三步,当处理器读取数据块的时候,计算数据块的摘要值,和处理器上保存的对应摘要值进行比较,如果相等,数据完整性未被篡改,如果不相等,则数据已被篡改。

第四步,当数据写入内存时,如果经过处理器确认修改合法,则可以执行,同时重新计算所涉及内存块的摘要值,并更新处理器芯片中保存的摘要值。

这类方法减少了每次计算的内存块的大小,并且可以通过在片上cache缓存内存块的摘要值减少对访存带宽的占用,但是这样会占用片上存储宝贵的存储空间。

3、针对方法1和方法2所存在的问题,很多研究者提出了基于树结构的内存完整性保护方法,包括Merkle Tree、可并行验证树PAT(the Parallelization Authentication Tree)和防篡改计数树TEC Tree(the Tamper-Evident Counter Tree)。基于树结构的内存完整性保护方法的步骤如下:

第一步,将要保护的数据分块,作为验证树的叶子节点,逐级向上计算,直到获得根节点的值。将根节点的值存储在可信区域(如处理器芯片中)。

第二步,读取数据的时候,通过计算被读取数据的完整性验证值,并且结合之前计算的其余完整性验证值,计算获得根验证值,和存储在可信区域的根验证值进行比较。如果相等,则表明数据没有被篡改,如果不相等,则表明数据被篡改。

第三步,写入数据的时候,如果写入合法,则以写入数据为输入,重新计算完整性验证树,计算根验证值,更新保存在可信区域的完整性验证树根验证值。

目前基于这种树形结构的内存完整性保护机制,分为基于物理地址和基于虚拟地址两类。基于物理地址的保护机制,对整个物理地址空间进行保护。基于虚拟地址的保护机制,对程序的整个虚拟地址空间进行保护。基于物理地址的保护机制无法预防攻击者通过修改虚实地址映射,用未被篡改的数据块顶替被篡改的数据块进行完整性验证而实施的攻击。基于虚拟地址的保护机制,由于程序的虚拟地址空间过大,构造树结构耗费巨大而很难实用。

发明内容

本发明要解决的技术问题是提供一种能够检测到程序运行时安全关键数据的篡改、安全性能高、防攻击性能强、完整性运算量小、占用存储空间少的运行时程序安全关键数据的完整性验证方法及装置。

为了解决上述技术问题,本发明采用的技术方案为:

一种运行时程序安全关键数据的完整性验证方法,其实施步骤如下:

1)在程序中指明待保护的安全关键变量,在编译程序时为安全关键变量生成对应的安全关键数据集合,在加载程序时将程序的虚拟地址空间分为保护区域和非保护区域、将安全关键数据集合加载至所述保护区域内,为所述程序的保护区域中的每一个虚拟页构造完整性验证树,并将所述完整性验证树的根验证值保存在处理器中;

2)当处理器发出读写操作向内存写入程序数据时,更新保存在处理器中的根验证值;在处理器片上高速缓存的读写操作从内存中读取程序数据时,生成新的完整性验证树的根验证值,并将新的根验证值与保存在处理器中的根验证值进行比较,如果两者相等则判定安全关键数据集合未被篡改,否则判定安全关键数据集合已经被篡改。

作为本发明运行时程序安全关键数据的完整性验证方法的进一步改进:

所述步骤1)的详细执行步骤如下:

1.1)编程时在程序中通过编译指导语句显式指明待保护的安全关键变量;

1.2)初始化安全关键数据集合为空,将编译指导语句显式指明的安全关键变量加入所述安全关键数据集合,对所述安全关键数据集合中的每一个安全关键变量进行引用-定值分析,然后将每一个安全关键变量的定值集合合并到所述安全关键数据集合中,直至所述安全关键数据集合中不再增加新的安全关键变量为止;

1.3)在生成可执行文件时构造用于存放安全关键数据集合的新数据段;

1.4)在操作系统加载程序的可执行文件时,将程序对应的虚拟地址空间分为保护区域和非保护区域,为所述新数据段在保护区域内分配虚拟页,并将所述安全关键数据集合分别加载至程序的保护区域内的虚拟页中;

1.5)为程序对应保护区域中的每一个虚拟页构造完整性验证树,并将所述完整性验证树的根验证值保存在处理器中。

所述步骤1.5)的详细执行步骤如下:

1.5.1)将程序对应保护区域中的每一个虚拟页以缓存行大小或者缓存行大小的2n倍划分为多个数据块,使每一个虚拟页按照缓存行对齐,其中n为整数;

1.5.2)对多个数据块采用哈希函数生成一级哈希值,然后根据预设的完整性验证树的叶子节点数量对多个一级哈希值作为一组进行合并生成二级哈希值、对多个二级哈希值作为一组进行合并生成三级哈希值,依次类推进行迭代,最终得到哈希树的根哈希值即为完整性验证树的根验证值;

1.5.3)将所述完整性验证树的根验证值保存在处理器中。

所述步骤1.5.3)中将完整性验证树的根验证值保存在处理器中时,每一个根验证值的地址ADDR为ADDR=BA+S*(N-1),其中BA为程序的虚拟地址空间中保护区域的基地址,S为每一个根验证值所占用的存储空间大小,N为根验证值在处理器中的存储编号。

所述处理器中的每一项根验证值的纪录包括进程编号、虚拟内存中的虚拟页编号和根验证值。

所述步骤2)的详细步骤如下:

2.1)获取处理器片上高速缓存的读写操作,如果读写操作的目的地址属于虚拟地址空间保护区域内,则跳转执行步骤2.2),否则按照普通读写操作执行;

2.2)如果所述读写操作是读操作则跳转执行步骤2.3),否则跳转执行步骤2.4);

2.3)在片上高速缓存发生读失效时,从内存中读取程序运行时数据,生成新的完整性验证树的根验证值,并将新的根验证值与保存在处理器中的根验证值进行比较,如果两者相等则判定安全关键数据集合未被篡改,否则判定安全关键数据集合已经被篡改;

2.4)判断写操作是否命中处理器片上高速缓存,如果在处理器片上高速缓存中失效则跳转执行步骤2.5),如果在处理器片上高速缓存中命中则跳转执行步骤2.6);

2.5)判断失效时的写策略,如果失效时的写策略为“不按写分配”策略,则将数据写入内存,然后更新保存在处理器中的根验证值;如果失效时的写策略为写分配策略,则首先发生一次读失效读取待写入数据在处理器片上高速缓存中所在的缓存行,然后跳转执行步骤2.6);

2.6)判断命中时的写策略,如果命中时的写策略为“写穿透”策略,则将数据写入处理器片上高速缓存的同时写入内存,然后更新保存在处理器中的根验证值;如果命中时的写策略为写回策略,则将数据写入处理器片上高速缓存,将对应的片上高速缓存块标记为脏数据,并以所述脏数据为输入数据,在下一次验证安全关键数据集合之前更新保存在处理器中的根验证值。

本发明还提供一种运行时程序安全关键数据的完整性验证装置,包括用于为程序的进程对应保护区域中的每一个虚拟页计算完整性验证树根验证值的数据完整性验证电路、用于存储根验证值的根验证值存储模块、用于将数据完整性验证电路输出的根验证值和根验证值存储模块存储的根验证值比较判断安全关键数据集合未被篡改的比较器,所述数据完整性验证电路通过数据通路分别与微处理器的片上高速缓存以及内存相连,所述比较器的输入端分别与数据完整性验证电路、根验证值存储模块相连,所述比较器的输出端与微处理器的CPU核相连;所述数据完整性验证电路在处理器发出读写操作向内存写入程序数据时,为对应保护区域中的每一个虚拟页构造完整性验证树,并将所述完整性验证树的根验证值保存在根验证值存储模块中;所述数据完整性验证电路在处理器片上高速缓存从内存中读写被保护数据时针对每个虚拟页计算完整性验证树的根验证值并输出给所述比较器,所述比较器将数据完整性验证电路输出的根验证值与保存在根验证值存储模块中的根验证值进行比较,如果两者相等则判定安全关键数据集合未被篡改,否则判定安全关键数据集合已经被篡改。

本发明运行时程序安全关键数据的完整性验证方法具有下述优点:

1、本发明能够预防基于硬件的攻击。本发明通过完整性验证树的根验证值比较,能够实现对运行时程序安全关键数据的完整性验证,从而发现对特定地址的数据的篡改行为,能够预防欺骗攻击、换位攻击和重放攻击等基于硬件的攻击,具有安全性能高、防攻击性能强的优点。

2、本发明能够预防基于软件的攻击。基于软件的攻击模型通常假设操作系统是不可信的,操作系统可能会修改程序地址空间的数据。而本发明通过每个进程的虚拟地址空间的保护区域维护一个基于虚拟地址的完整性验证树,任何非本进程的对数据的更新操作都能够被处理器所感知,因此能够防范基于软件的攻击,能够进一步增强安全性能和防攻击性能。

3、本发明能够节约片上和片外存储空间。本发明在生成完整性验证树时,不是针对进程的整个虚拟地址空间进行验证,而是借助编译的方法,首先界定出程序需要保护的安全关键数据,再将这些安全关键数据保存在虚地址空间的保护区域,再对这些数据构造完整性验证树,可以有效的减少树的规模,从而节约了片上和片外存储完整性验证值所需要的空间,减少了所需的计算,具有完整性运算量小、占用存储空间少的优点。

本发明运行时程序安全关键数据的完整性验证装置为与前所述运行时程序安全关键数据的完整性验证方法向对应的结构部件,因此具有与前述运行时程序安全关键数据的完整性验证方法相同的技术效果,在此不再赘述。而且本发明运行时程序安全关键数据的完整性验证装置借助独立的硬件完成高效的完整性验证树的验证和更新,整个完整性验证树的验证和计算由处理器芯片上的完整性验证电路完成,计算高效,同时由于微处理器的片上高速缓存在程序运行过程中会缓存验证过的数据,从而减少了内存的访问,减少了重新计算完整性验证值的次数,从而加速了完整性验证树的验证和更新过程。

附图说明

图1为现有技术的内存和片外总线可能遭受物理攻击的三种类型示意图。

图2为本发明实施例方法的基本实施流程示意图。

图3为本发明实施例中生成安全关键数据集合的流程示意图。

图4为本发明实施例中读失效时的处理流程示意图。

图5为本发明实施例中“写穿透”和“不按写分配”的写操作处理流程示意图。

图6为本发明实施例中写更新根验证值的处理流程示意图。

图7为本发明实施例中完整性验证树的结构示意图。

图8为本发明实施例中完整性验证树根验证值的存储格式示意图。

图9为应用本发明实施例装置的微处理器系统框架示意图。

具体实施方式

如图2所示,本实施例运行时程序安全关键数据的完整性验证方法的实施步骤如下:

1)在程序中指明待保护的安全关键变量,在编译程序时为安全关键变量生成对应的安全关键数据集合,在加载程序时将程序的虚拟地址空间分为保护区域和非保护区域、将安全关键数据集合加载至保护区域内,为程序的保护区域中的每一个虚拟页构造完整性验证树,并将完整性验证树的根验证值保存在处理器中;

2)当处理器发出读写操作向内存写入程序数据时,更新保存在处理器中的根验证值;在处理器片上高速缓存的读写操作从内存中读取程序数据时,生成新的完整性验证树的根验证值,并将新的根验证值与保存在处理器中的根验证值进行比较,如果两者相等则判定安全关键数据集合未被篡改,否则判定安全关键数据集合已经被篡改。

本实施例将程序的虚拟地址空间分为保护区域和非保护区域,通过程序员在编程时显式指明安全关键变量,再通过编译,将程序的安全关键数据集合存储于程序虚地址空间的保护区域;然后基于保护区域构建完整性验证树,将树根验证值保存在处理器芯片上;在读写操作时,通过完整性验证树进行验证或者更新,检验和保护片外虚存空间数据的完整性,解决了内存完整性运算量大和占用过多存储空间的问题,并由于完整性保护是基于虚地址空间的,可以有效的防止针对数据完整性的多类攻击,使程序运行时能够检测到对安全关键数据的篡改。本实施例通过编程和编译过程,将程序的安全关键数据存储于虚地址空间的保护区域。然后基于保护区域构建完整性验证树,将树根验证值保存在处理器芯片上,在读写操作时,通过完整性验证树进行验证或者更新,检验和保护片外虚存空间数据的完整性。

本实施例针对同时运行多个进程的多核处理器,每个进程都有一个完整性验证树的树根值保存在处理器的存储结构中,并根据进程的进程编号(ASID)来进行匹配,查找对应的完整性验证树根值。

本实施例中,步骤1)的详细执行步骤如下:

1.1)编程时在程序中通过编译指导语句显式指明待保护的安全关键变量;

1.2)初始化安全关键数据集合为空,将编译指导语句显式指明的安全关键变量加入安全关键数据集合,对安全关键数据集合中的每一个安全关键变量进行引用-定值分析,然后将每一个安全关键变量的定值集合合并到安全关键数据集合中,直至安全关键数据集合中不再增加新的安全关键变量为止;

1.3)在生成可执行文件时构造用于存放安全关键数据集合的新数据段;

1.4)在操作系统加载程序的可执行文件时,将程序对应的虚拟地址空间分为保护区域和非保护区域,为新数据段在保护区域内分配虚拟页,并将安全关键数据集合分别加载至程序的保护区域内的虚拟页中,其余数据则仍然加载到非保护区域;

1.5)为程序对应保护区域中的每一个虚拟页构造完整性验证树,并将完整性验证树的根验证值保存在处理器中。

每个程序的虚存空间由多个虚拟页组成,本实施例中将虚拟页分为两类,分别隶属于保护区域和非保护区域,通过虚拟页的页描述符的属性位进行标识。显式的指明程序中哪些变量是安全关键变量,由编译程序将这些安全关键变量涉及的数据集中存储在该程序虚存空间的保护区域中,其余非安全关键数据保存在虚存空间的非保护区域。本实施例中,步骤1.3)构造一个新的数据段命名为safe_data,safe_data用于存放安全关键数据集合Φ中的变量信息。本实施例将程序对应的虚拟地址空间分为保护区域和非保护区域,同时将虚拟页的页描述符的页属性增加属性safe,当safe属性为真时表示该虚拟页属于保护区域,当safe属性为假时表示该虚拟页属于非保护区域,在分配到内存时则根据safe属性分配到保护区域或者非保护区域。操作系统加载可执行文件、给safe_data段分配页的时候,将该虚拟页的safe属性置为真。

一般的编译过程都会对变量进行引用-定值分析,生成变量的定值集合和引用集合。本实施例的步骤1.2)则利用引用-定值分析,得到的安全关键变量的定值集合和引用集合来生成安全关键变量的“引用-定值”集合,构成安全关键数据集合。假设变量x的定值集合为Udef{x},根据定值集合的定义,Udef{x}中任何一个变量y的值发生改变,都将影响到x的值。如果x是安全关键变量,那么y必须加入安全关键数据集合。

如图3所示,本实施例中将安全关键数据集合记为Φ,步骤1.2)的执行步骤中,首先初始化为空集,然后将程序中由程序员通过编译指导语句指定的安全关键变量都加入集合Φ。接着需要遍历集合Φ,将其中每个元素的定值集合都加入集合Φ。如果在此过程中Φ增加了新的元素,则重复上一步工作,直到Φ中不再增加新的元素为止,最后得到的集合Φ就是安全关键数据集合;步骤1.2)的详细执行步骤如下:

1.2.1)初始化安全关键数据集合Φ为空;

1.2.2)将编译指导语句显式指明的安全关键变量加入安全关键数据集合Φ;

1.2.3)对安全关键数据集合中的每一个安全关键变量进行引用-定值分析,然后将每一个安全关键变量的定值集合Udef{x}合并到安全关键数据集合Φ中,直至安全关键数据集合Φ中不再增加新的安全关键变量x为止。

如图4所示,与通用完整性验证树的结构相同,本实施例的完整性验证树中,D1、D2、D3和D4表示内存中的数据块。f表示完整性验证函数,f可以是哈希函数,也可以是MAC函数和加密函数,由具体实现确定。Node表示完整性验证树的中间节点,为其叶子节点通过f函数计算获得的结果。ROOT为完整性验证树根值,该值将保存在可信区域里面(如处理器上)。对于单个进行虚拟地址空间的保护区域,其大小是可伸缩的,取决于程序要保护的关键数据的大小。当保护区域的虚拟页数目增加,要求树的结构必须是可伸缩的,对于固定结构的树,叶子节点越多,其级数越多。例如,如果采用四叉树结构,三级四叉树,最多可以容纳16个虚拟页。如果这时增加需要验证的内存的页面,则树的级数必须增加为四级。

完整性验证树可以采用二叉树,也可以采用四叉树等结构,本实施例中采用四叉树(完整性验证树的叶子节点数量为4)。本实施例中,步骤1.5)的详细执行步骤如下:

1.5.1)将程序对应保护区域中的每一个虚拟页以缓存行大小或者缓存行大小的2n倍划分为多个数据块,使每一个虚拟页按照缓存行对齐,其中n为整数;

1.5.2)对多个数据块采用哈希函数生成一级哈希值,然后根据预设的完整性验证树的叶子节点数量对多个一级哈希值作为一组进行合并生成二级哈希值、对多个二级哈希值作为一组进行合并生成三级哈希值,依次类推进行迭代,最终得到哈希树的根哈希值即为完整性验证树的根验证值;

1.5.3)将完整性验证树的根验证值保存在处理器中。

以保护区域的单个虚拟页为例,假设页大小为4K字节,数据块大小128字节。则虚拟页被分为32个数据块,编号为D0、D1、…、D31。构造四叉完整性保护树时,首先,对数据块D0、D1、…、D31计算哈希值得到多个一级哈希值标记为H0、H1、…、H31,将这些节点标记为第0级(L0)。然后在一级哈希值中以4个一组计算哈希值得到多个二级哈希值H32、H33、…、H39,例如,H32可以采用式(1)计算。

H32 = h(H0 || H1 || H2 || H3)                           (1)

式(1)中,h是哈希函数,|| 为连接符,表示将两个数值拼接的操作。

依此类推,计算出三级哈希值H40和H41,三级哈希值只有两个节点,然后通过式(2)计算出完整性验证树的根验证值ROOT。

ROOT = h(H40 || H41)                                                            (2)

由于假设处理器芯片外的区域是不可信的,因此本实施例将根验证值将保存在处理器中,其余的哈希值则保存在内存中,当微处理器从内存中读取数据时,需要通过对哈希树的重新计算得到根哈希值,和保存于处理器里面的根哈希值进行比较,如果相等,证明数据没有被篡改,如果不等,则证明数据被篡改了。当处理器向内存写入数据的时候,需要通过重新计算根哈希值,来更新哈希树,并更新芯片内保存的根哈希值。

本实施例中微处理器在内部的存储器中开辟专门的区域保存根验证值,为了快速查找到特定的根验证值,步骤1.5.3)中将完整性验证树的根验证值保存在处理器中时,每一个根验证值的地址ADDR为ADDR=BA+S*(N-1) ,其中BA为程序的虚拟地址空间中保护区域的基地址,S为每一个根验证值所占用的存储空间大小,N为根验证值在处理器中的存储编号。

如图5所示,本实施例中,处理器中的每一项根验证值的纪录包括进程编号(ASID)、虚拟内存中的虚拟页编号(VPN)和根验证值(ROOT),每个进程对应一个完整性验证树,每个完整性验证树一个根值。此外,还可以进一步为每一项根验证值的纪录增加辅助时间戳等机制为数据打上时间标记,从而预防对特定地址的数据的重放攻击行为。

本实施例中,步骤2)的详细步骤如下:

2.1)获取处理器片上高速缓存的读写操作,如果读写操作的目的地址属于虚拟地址空间保护区域内,则跳转执行步骤2.2),否则按照普通读写操作执行;

2.2)如果读写操作是读操作则跳转执行步骤2.3),否则跳转执行步骤2.4);

2.3)在片上高速缓存发生读失效时,从内存中读取程序运行时数据,生成新的完整性验证树的根验证值,并将新的根验证值与保存在处理器中的根验证值进行比较,如果两者相等则判定安全关键数据集合未被篡改,否则判定安全关键数据集合已经被篡改;

2.4)判断写操作是否命中处理器片上高速缓存,如果在处理器片上高速缓存中失效则跳转执行步骤2.5),如果在处理器片上高速缓存中命中则跳转执行步骤2.6);

2.5)判断失效时的写策略,如果失效时的写策略为“不按写分配”策略,则将数据写入内存,然后更新保存在处理器中的根验证值;如果失效时的写策略为“按写分配”策略,则首先发生一次读失效读取待写入数据在处理器片上高速缓存中所在的缓存行,然后跳转执行步骤2.6);

2.6)判断命中时的写策略,如果命中时的写策略为“写穿透”策略,则将数据写入处理器片上高速缓存的同时写入内存,然后更新保存在处理器中的根验证值;如果命中时的写策略为“写回”策略,则将数据写入处理器片上高速缓存,将对应的片上高速缓存块标记为脏数据,并以脏数据为输入数据,在下一次验证安全关键数据集合之前更新保存在处理器中的根验证值。

如图6所示,步骤2.3)在读失效时,本实施例首先根据失效数据的虚拟地址判断该地址是否属于进程的保护区域,如果不属于保护区域,则采用传统的无验证的片上高速缓存失效处理流程,如果属于保护区域,则转入验证流程。验证时,首先判断失效地址所属数据块和完整性验证树分支,重新计算该分支的验证值,再读取完整性验证树其余分支的中间节点的验证值,一起计算出完整性验证树的根验证值ROOT’。将ROOT’和ROOT进行比较,如果相等,本次验证成功,数据没有被篡改,如果不相等,则验证失败,引发处理器异常。

如图7所示,片上cache向内存写回数据的处理流程中(如果采用“写穿透”配合“不按写分配”方式),处理器将数据写回内存之前,首先由完整性验证电路判断要写回数据的虚拟地址属于当前进程的虚拟地址的保护区域,如果不属于保护区域,则采用传统的无验证的写回流程,如果属于保护区域,则转入写更新流程更新保存在处理器中的根验证值。

如图8所示,写更新流程在更新保存在处理器中的根验证值时,首先判断写回数据的地址所属的数据块和完整性验证树的分支,先用旧的数据重新计算该分支的验证值(哈希值),验证本分支的数据块都没有被篡改。再用新的数据,逐级重新计算整个完整性验证树的根验证值,并用新的根验证值(ROOT’)替换原有的根验证值(ROOT),更新保存在处理器中的根验证值,完成写更新操作。

如图9所示,本实施例运行时程序安全关键数据的完整性验证装置包括用于为程序的进程对应保护区域中的每一个虚拟页计算完整性验证树根验证值的数据完整性验证电路1、用于存储根验证值的根验证值存储模块2、用于将数据完整性验证电路1输出的根验证值和根验证值存储模块2存储的根验证值比较判断安全关键数据集合未被篡改的比较器3,数据完整性验证电路1通过数据通路分别与微处理器的片上高速缓存以及内存相连,比较器3的输入端分别与数据完整性验证电路1、根验证值存储模块2相连,比较器3的输出端与微处理器的CPU核相连;数据完整性验证电路1在处理器发出读写操作向内存写入程序数据时,为对应保护区域中的每一个虚拟页构造完整性验证树,并将完整性验证树的根验证值保存在根验证值存储模块2中;数据完整性验证电路1在处理器片上高速缓存从内存中读写被保护数据时针对每个虚拟页计算完整性验证树的根验证值并输出给比较器3,比较器3将数据完整性验证电路1输出的根验证值与保存在根验证值存储模块2中的根验证值进行比较,如果两者相等则判定安全关键数据集合未被篡改,否则判定安全关键数据集合已经被篡改。

应用本实施例的微处理器芯片包括单个或者多个处理器核(图中仅示意一个处理器核,多个处理器核也相同)、多级片上高速缓存,片上存储管理单元(MMU)、本实施例运行时程序安全关键数据的完整性验证装置等。片上存储管理单元(MMU)负责虚实地址的转换,将虚拟地址转换到物理地址,完整性验证装置则完成内存数据的完整性验证。本实施例完整性验证装置的内存完整性验证电路1位于最后一级高速缓存和片外存储器(内存)之间。该微处理器芯片在标准的处理器芯片上增加了完整性验证电路1、存储进程的完整性验证树根值的根验证值存储模块2、比较器3,并增加相应的控制通路和数据通路,当片外存储器(内存)和处理器芯片交互数据的时候,本实施例完整性验证装置对涉及的数据块的完整性进行验证,计算出完整性验证树的根值,和片上存储的根值进行比较,并输出完整性验证的结果。

本实施例完整性验证装置的工作过程如下:

B1)程序运行过程中,处理器发出需要访问的虚拟地址,经过片上存储管理单元转换成物理地址,在片上高速缓存中进行查找,如果片上高速缓存命中,由于片上高速缓存是可信的,则直接返回数据给处理器访问。如果发生失效,则引发从内存读取包含该物理地址的缓存行(cache行)的操作。这时,数据完整性验证电路1需要对读入的缓存行的完整性进行检验。详细步骤如B1.1)~B1.3)所示。

B1.1)数据完整性验证电路1根据失效虚拟地址获得需要重新计算一级哈希值的数据块虚拟地址:判断其是否属于虚拟地址空间的保护区域;如果属于虚拟地址空间的保护区域,则以该数据块和它同父节点的数据块为输入,重新计算对应数据块的一级哈希值。

B1.2)数据完整性验证电路1从内存中获取该进程完整性验证树上其余各级哈希值并最终完成完整性验证树的重新计算,获得新的完整性保护树的根验证值。在计算过程中,如果这些中间哈希值在之前的验证过程中已经被缓存并且不需要更新,则直接从高速缓存中直接返回这些值用于重新计算。

B1.3)比较器3将数据完整性验证电路1新计算得到的根验证值与根验证值存储模块2中保存的原始根验证值进行比较,如果匹配,表明安全关键数据集合没有被非法篡改,后继操作可以进行;如果不匹配,表明安全关键数据集合被非法篡改,则引发处理器异常。

B2)程序运行过程中,当处理器需要将片上高速缓存中修改的数据块写回内存时,数据完整性验证电路1需要对完整性验证树进行更新。

程序运行过程中,如果处理器发出的写操作在片上高速缓存中失效,则根据失效时是否按写分配的策略分别有不同的处理方法:如果写分配的策略是“按写分配”,则首先发生一次读失效,读取要写入的数据所在的cache行,后继处理和写命中一致;如果写分配的策略是“不按写分配”,则数据直接写入内存,引发数据完整性验证电路1对完整性保护树的更新操作。

程序运行过程中,如果写操作在片上高速缓存中命中,则根据不同的写策略(“写穿透”策略或者写回策略),分别有不同的处理方法:如果是“写穿透”策略,数据写入片上高速缓存的同时还要写入内存,会引发数据完整性验证电路1对完整性保护树的更新操作。如果是写回策略,数据先写入片上高速缓存,并且将所涉及的片上高速缓存块标识为脏的(dirty),当发生片上高速缓存替换的时候再写回内存,此时引发完整性保护树的更新操作。对于写回策略,在脏数据写回内存之前,存在数据版本新于完整性保护树版本的时间段,在这个时间段内发生的读操作,如果没有在片上高速缓存中命中,则会引发完整性保护树的验证过程,因此,必须在进行完整性验证之前,先以片上高速缓存中脏数据为输入,更新完整性验证树,再启动后继的完整性验证树的更新过程。对于“写穿透”策略,由于不存在数据版本和完整性保护树版本不一致的情况,则控制较为简单。

综上,“写穿透”策略一般配合“不按写分配”策略,写回策略一般配合写分配策略。本实施例中以“写穿透”和“不按写分配”策略为例,说明程序将数据写回内存时的完整性保护树的更新过程。

B2.1)当程序运行过程中,处理器发出写数据的请求的时候,片上存储管理单元将处理器发出的虚拟地址转换为物理地址,同时数据完整性验证电路1根据处理器发出的虚拟地址,确定要更新的数据是否位于虚拟地址空间的保护区域,如果是,计算其位于完整性保护树的哪个虚拟页上,即确定了要更改数据位于树的哪个节点和哪个分支上。

B2.2)在数据被修改之前,比较器3首先按照完整性验证树的验证流程,对要修改数据所在的分支进行验证,确认该分支的数据没有被篡改。如果发现篡改,向处理器发出异常。如果没有被篡改,进入下一步。在该过程中,如果完整性验证树的中间节点已经被缓存在片上高速缓存中,则无需重新计算完整性验证值。这是因为假设片上高速缓存位于可信区域(微处理器中)。

B2.3)完整性验证通过之后,用新数据重新计算完整性验证根值,其余无关的完整性验证值无需重算,数据完整性验证电路1直接采用之前的计算结果。最终数据完整性验证电路1将计算得到新的根验证值替换掉根验证值存储模块2内保存的旧值。

B2.4)如果片上高速缓存命中,将要修改数据写入片上高速缓存,同时将数据写入内存,同时数据完整性验证电路1更新根验证值存储模块2中的完整性验证值。如果片上高速缓存失效,则直接将数据写入内存,同时数据完整性验证电路1更新根验证值存储模块2中的完整性验证值。

以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号