硬件安全问题频频发生,造成的后果日益严重,例如伊朗核电站震网事件,攻击者通过网络激活事先植入的硬件木马使电机转子超负荷运转烧毁。然而,现今硬件设计仍缺乏有效的安全验证方法检测,导致硬件设计中存在潜在的安全漏洞、木马、恶意程序等。
现有的安全验证技术主要包含仿真和形式化验证技术,但是仿真技术存在覆盖率难以保证的问题。
形式化验证技术采用严格的数学定义描述电路规范,形式化检查硬件行为特征.现有的形式化验证技术包括模型检验和定理证明。
模型检验(Model Checking)
采用搜索算法验证设计是否满足设计规范,但会因设计规模的增大导致状态空间爆炸。虽然引入符号执行后解决了状态空间爆炸问题,但仍可能导致路径爆炸。
定理证明(Theorem Proving)
采用形式化语言描述程序规范和性质,用演绎的方法交互式地验证程序的规范和性质。
模型检验(model checking)是一种被广泛应用的验证有限状态系统满足规范的形式化方法,主要针对具有逻辑性质的有限状态系统,由 Clarke等人最早提出。
将待验证系统建模为有限状态机,如Kripke结构、状态-迁移系统(State Transition system)或自动机等,将系统期望的性质描述为时序逻辑公式;然后,自动化穷举搜索系统行为以确定待验证系统是否满足期望的性质。
若不满足,根据反馈信息判断具体系统中是否确实存在违反此属性的执行路径(即反例路径)。
由于模型检验器在算法支持下可以自动执行,并能在系统不满足性质时提供反例路径,因此备受工业界关注。
模型检验的思想基于穷尽搜索,这也就造成了其最大缺点是不能解决推理问题,极易发生状态爆炸(state explosion),这已经成为影响模型检验应用的重要瓶颈1。
模型检验大致可分为以下三个步骤:
(1)系统建模
在此阶段需要把系统的Kripke结构用形式化语言描述出来,即将系统的状态集合及状态迁移关系进行形式化描述。具体使用哪种描述语言要根据模型检验工具来确定,每个不同的模型检验工具都有各自的建模语言。系统建模的关键在于正确地描述好系统的状态迁移关系,这是进行规范验证的前提条件,因为迁移关系描述有误则不能保证规范验证的结果是可靠的。此外,还要注意尽量使用精简的方式来描述系统,避免因为引入过多变量而造成的系统状态爆炸问题。
(2)建立规范
通常将需要验证的系统性质表示为时态规范,即时态逻辑(temporal logic)表达式。对硬件或软件系统,时态逻辑能够断言系统随着时间演变的行为变化。不同的模型检验工具对规范的描述有不同的要求。如SPIN中的规范必须使用LTL来描述,SMV则能同时接受LTL和CTL描述的规范。虽然建立规范能验证系统是否满足某个规范,但由于模型检验方法是基于语义推导的,因此并不能确定给定的规范是否涵盖了系统应满足的所有性质。
(3)系统验证
在理想情况下,系统验证过程是由模型检验工具自动进行的。然而在实际应用中常常需要人工参与,这通常涉及到对验证结果的分析。如果系统不满足规范,模型检验工具往往会把出错的路径呈现给设计者,并能帮助设计者跟踪到出错的地方。产生错误也可能是因为不正确的系统建模或是不正确的规范要求所导致,而错误路径可用于发现和修补这两类问题。此外,验证任务可能会非正常终止,这是因为模型规模太大以致于不能装进计算机内存。在这种情况下,通常需要更改模型检验工具的参数或调整模型后重新进行验证。
目前常用的一些减少和压缩状态空间的方法主要有:二叉决策图、符号模型检验、偏序规约、抽象技术和组合逻辑等。这些方法也是目前在模型检验中抑制状态爆炸的主要技术。
二叉决策图(BDD)是一种有根无环图,最初由 Bryant 提出,用来存储布尔表达式。该技术极大地减少了存储布尔公式所需的空间,使模型检验工业应用成为可能。二叉决策图是一种表示布尔函数的高效方法,它首先是作为一种简单的形式,即二值判定树(BDT)被提出来的。二叉决策图可通过对二值判定树进行优化(如对一些计算进行短路、规约)得到。
符号模型检验(Symbolic Model Checking)最早由 Carnegie Mellon University 在读博士生McMillan 提出,其主要思想是使用状态集相关的属性来表示集合,用布尔公式来刻画属性,并用二叉决策图在计算机内实现这些布尔公式及其运算。该方法自上个世纪 90 年代出现以来已经普遍应用于大规模集成电路系统的设计中,它能验证的状态规模已经达到 1 0 120 10^{120} 10120,从而能很好地抑制状态爆炸问题。
一个系统可以由多个进程组成, 并发执行使得不同进程的动作可以有许多不同的次序。基于对这一问题的认识, 我们可以将某些状态的次序固定, 以减少重复验证本质上相同的路径,这种方法被称为偏序归约。
最初,偏序规约是为解决因并发异步模型交替执行导致的空间爆炸而提出的一种技术,由 Overman 首先提出。并发系统的一次执行可以看作是各事件按执行顺序“插入”得到的一个插入序列,这样,对 n n n 个事件可产生 n ! n! n! 个插入序列。有些事件可能与执行次序无关,若把这些事件预先插入到序列中的固定位置,便可避免验证一批本质上相同的路径。
一般来说,能够减少搜索空间的方法能同时节省时间和内存空间的需求。由于内存空间在某些情况下比时间更为重要,该偏序规约便是以时间换空间的典型例子。
抽象技术是另一种除符号模型检验方法外有效抑制状态爆炸的重要手段。传统的模型检验方法主要适用于面向控制的系统, 而不太适合与数据路径有关的电路系统或具有复杂数据结构的反应系统。符号模型检验方法虽然可以处理一些与数据处理有关的系统,但其验证的复杂性往往较高。因此,对于这类系统的验证, 常常需要采用抽象技术, 即在系统的精确数据值和一个小的抽象数据值之间建立一个映射关系, 通过扩展状态和转换之间的映射, 产生一个比实际系统小得多的抽象系统。
此外,状态合并是另一种重要的抽象技术, 为了压缩状态空间, 它通过消除一些不影响规范的变量状态, 得到简化的自动机模型,通过验证简化模型的性质来降低模型检验的复杂性。
其他一些优化技术, 如组合推理是一种基于检测局部状态空间的方法。对于大型系统的验证, 组合推理方法利用“分而治之”策略, 根据系统模块结构, 先分别验证系统各个局部模块的性质, 再由局部模块的性质推断整个系统的性质。如果系统满足每一局部性质, 并且局部性质的合取蕴涵了整个规范, 那么完整的系统也必定满足这个规范。总而言之,组合推理是借助分治策略,从本地属性推导出全局属性,从而减小状态空间。
由于在多进程组成的系统中,某些进程可能完全类似, 并发执行的结果可能产生许多相同或相似的路径。此时,我们可以只搜索在对称关系中等价的一种情形, 以避免重复搜索对称或相同的系统状态。这种方法被称为对称模型检验(Symmetry Model Checking)。
对称模型检验通过划分等价类来达到简化状态空间的目的。它只考虑等价类中的一种情形,以此为基础,类推同类的其他情形。
值得一提的是,在实际应用中,针对不同验证对象(包括待验模型和待测属性),选取的优化措施也不同。即使是同一种优化技术,在不同工具中实现的策略和方法也不尽相同。
它需要形式刻画系统模型及待测性质,再通过公理或推理规则来证明系统具有该性质,并可使用归纳推理来验证无穷状态系统。但是该测试方法应用需要很专业的数学知识,虽有相关工具支持(如PVS),但自动化程度低,验证周期长,难以被工业界接受。