一种利用图同构验证编译器的方法技术

技术编号:9642343 阅读:199 留言:0更新日期:2014-02-07 00:48
本发明专利技术公开一种利用图同构验证编译器的方法,包括待处理的源程序和将源程序生成目标程序的编译器,在选定环境下建立一个反编译器,通过反编译器将目标程序反编译成对比程序,验证对比程序和源程序之间的语义一致性,并在此基础上,分别建立源程序和对比程序的控制流图相关结点信息后进行同构判定,从而得到编译器是否安全的结论。本发明专利技术通过判断对比程序与源程序的控制流图是否同构,来验证编译器的安全性。该方法直接将反编译后的代码与源代码进行语义比较,避免了验证过程中由于源代码信息丢失导致验证不全面的问题,该算法不需要再次遍历控制流图,使得图同构判断算法简单,易于实现。

【技术实现步骤摘要】
【专利摘要】本专利技术公开,包括待处理的源程序和将源程序生成目标程序的编译器,在选定环境下建立一个反编译器,通过反编译器将目标程序反编译成对比程序,验证对比程序和源程序之间的语义一致性,并在此基础上,分别建立源程序和对比程序的控制流图相关结点信息后进行同构判定,从而得到编译器是否安全的结论。本专利技术通过判断对比程序与源程序的控制流图是否同构,来验证编译器的安全性。该方法直接将反编译后的代码与源代码进行语义比较,避免了验证过程中由于源代码信息丢失导致验证不全面的问题,该算法不需要再次遍历控制流图,使得图同构判断算法简单,易于实现。【专利说明】—种利用图同构验证编译器的方法
本专利技术涉及核电领域,具体涉及核电中用于生成安全级代码的编译器的安全性验证方法。
技术介绍
编译器作为软件的生成工具,在那些对软件安全性要求十分高的特殊环境里面,其安全性至关重要,特别是用于核安全级保护系统的软件。在核安全级系统中,一方面为了保证软件运行的安全性,程序员经常会引入查错程序或者防御性的程序,而经过编译后的目标代码为了保持源代码的安全性,要求编译器不能在无警告或提示下删除程序员引入的防御程序或查错程序,从而导致目标程序不符合安全级软件的要求;另一方面,由于编译器的漏洞以及人为的后门程序可能会对整个软件造成根本性的破坏,所以,要求编译器在编译的过程中不会人为的插入恶意代码。由此,在验证编译正确性的基础上必须从以上两个方面验证编译器的安全性。目前对于编译器的验证技术主要有形式化验证技术以及测试验证技术,其中,形式化验证技术是从编译器本身的正确性或者是从保证被编译对象的正确性入手进行证明,但是这个方法实现难度较大,成功案例也仅限应用于某个语言子集的证明,很难推广到现有的工程应用上来。而测试验证技术由于无法对其输入进行全覆盖,以及编译器的复杂性所带来的巨大工作量,使得仅靠测试验证技术难以完成对编译器的完整的验证。此外,这些验证技术仅基于编译器逻辑正确性的验证,即对源代码和目标代码行为是否一致的验证,且都没有很好的解决编译器对恶意代码注入的问题,以及编译器对那些不影响动态语义的防御程序的删除的问题。故除了依赖对编译器的逻辑正确性验证之夕卜,还需要多遍交叉编译、目标文件结构化比较、目标文件反编译逻辑比较等理论和方法完成对安全性的验证。在现有技术中验证代表包括:(I)、ISTec利用反编译技术由独立的小组开发从目标程序翻译到源程序的反编译器,比较源代码与目标代码反编译后的代码的一致性,来实现对编译器的正确性验证的方式。(2)、Xavier Leroy带领的CompCert项目组利用定理证明的形式化方法首次完成了从C light到PowerPC转换过程的正确性形式化验证。但是,这种针对编译器本身的形式化验证方法一般较难实现,且证明整个编译器的正确性也比较困难,即使是CompCert小组也只是针对编译器的后端进行了证明。(3)、俞甲子基于GCC编译器提出了一种除了能够验证编译器逻辑正确性之外,还可对编译器的安全性进行验证的方法。该方法结合了编译器代码分析及对比验证方案和源代码与目标代码控制流图同构比较方案。其中编译器代码分析及对比验证方案首先对编译器的设计及源代码进行分析,针对每个函数进行分类,对能够改变输入数据的函数进行重新编写,对比原始版本的数据结构和重新设计的数据结构;控制流图同构比较方案是采用对源代码和目标代码抽取控制流图,并判断控制流图是否同构来排除编译时是否人为的插入恶意代码。
技术实现思路
为解决现有技术中无法验证编译器安全性的问题,本专利技术提供一种利用源程序和对比程序的控制流图是否同构的方法来检测编译器的安全性。具体方案如下:,包括待处理的源程序和将源程序生成目标程序的编译器,在选定环境下建立一个反编译器,通过反编译器将目标程序反编译成对比程序,验证对比程序和源程序之间的语义一致性,其特征在于,在此基础上分别建立源程序和对比程序的控制流图相关结点信息后进行同构判定,从而得到编译器是否安全的结论,具体步骤如下:步骤1、首先对源程序和对比程序的语句按顺序进行扫描,并利用带序号的结点进行标识,同时标明各结点的出边信息;步骤2、同时建立一个辅助栈表,并将当前结点及相关结点信息压入辅助栈表;步骤3、对条件结构的所有结点进行简化并用简化结点替代,然后将简化结点压入辅助栈表原条件结构的结点位置处形成简化栈表,并且在程序中所有结点被扫描完成之后,将栈表中的结点依次出栈,在上述简化过程中,建立该结点的邻接链表,同时建立一个记录简化结点信息的简化信息表;步骤4、根据结点的邻接链表和简化信息表建立源程序和对比程序的出入度信息,并生成相应的η点连通子图的出入度序列;步骤5、根据出入度序列判断源程序和对比程序的控制流图是否同构;其中,当两个控制流图中的任意η点连通子图的出入度序列相同时,则表明两个控制流图是同构的,进而表明源程序与目标程序是相同的,并得到编译器是安全的结果;反之,则证明编译器是不安全的。为根据不同的结构设置相应的结点:所述步骤I中,结点的添加标准如下:步骤11、首先在源程序和对比程序的开始和结尾分别增加一个开始结点和终止结占.步骤12、顺序执行的语句(程序)用一个结点标识;步骤13、条件语句的起始句用一个条件起始结点标识,中间的各条件表达式分别用一个中间结点标识,同时增加一个条件语句的条件结束结点;步骤14、循环语句的起始句用一个执行结点标记,结尾语句用一个判断结点标记;步骤15、在分析时遇到RETURN语句则单独添加一个返回结点。为建立出入度信息:各结点的出边连接方法如下:步骤31、按各结点排列顺序依次连接;步骤32、遇到条件语句的结点时,条件起始结点与各中间条件表达式的中间结点按顺序连接,如遇到返回结点时,则返回结点的出边直接与终止结点连接,否则按顺序连接条件结束结点;步骤33、遇到循环语句的结点时,执行语句结点指向判断结点,判断结点分别指向执行语句结点和顺序排列的下一个结点。为方便后续检索:所述辅助栈表的基本信息包括如下内容:A、按分析顺序生成的各结点的类型,包括顺序类型、条件类型和循环类型,各类型以相应结构的起始句为标识进行区分;B、各结点对应的排列序号;C、每个结点所包含的结点数量;D、所包含的return语句数量。为方便查找各结点:所述步骤3中,邻接链表记录每个结点的出边信息,并记录所有邻接链表的表头指针信息以作为检索信息。为方便查找简化结点的信息:所述步骤3中,简化信息表的内容包括结点名、被简化结构包含的结点个数、起始结点和终止结点名,以及所涉及的return分支数量。为方便源程序和对比程序的对比:所述步骤4中,出入度序列的建立方法如下:步骤41、根据邻接链表中的结点信息统计出各结点的出度和入度信息;步骤42、然后依次读取简化栈表中各结点的信息,遇到简化结点时,并用简化结点及其出度、入度信息去更换被简化结构相应位置结点的出度、入度信息,同时更新该被简化块的出入度信息,并且连同该简化块的结点总数一起记录下来;步骤43、分别统计更新后源程序和对比程序的η点连接子图的出入度序列,并对其中的出度和入度按大小进行排序。本专利技术在利用反编译技术的基础上,将目标代码反编译之后的对比程序与源程序利用常规手段进行语义一致性比较,本文档来自技高网
...

【技术保护点】
一种利用图同构验证编译器的方法,包括待处理的源程序和将源程序生成目标程序的编译器,在选定环境下建立一个反编译器,通过反编译器将目标程序反编译成对比程序,验证对比程序和源程序之间的语义一致性,其特征在于,在此基础上分别建立源程序和对比程序的控制流图相关结点信息后进行同构判定,从而得到编译器是否安全的结论,具体步骤如下:?步骤1、首先对源程序和对比程序的语句按顺序进行扫描,并利用带序号的结点进行标识;?步骤2、同时建立一个辅助栈表,并将当前结点及相关结点信息压入辅助栈表框;?步骤3、对条件结构的所有结点进行简化并用简化结点替代,然后将简化结点压入辅助栈表原条件结构的结点位置处形成简化栈表,并且在程序中所有结点被扫描完成之后,将栈表中的结点依次出栈,在上述简化过程中,建立该结点的邻接链表,同时建立一个记录简化结点信息的简化信息表;?步骤4、根据结点的邻接链表和简化信息表建立源程序和对比程序的出入度信息,并生成相应的n点连通子图的出入度序列;?步骤5、根据出入度序列判断源程序和对比程序的控制流图是否同构;其中,当两个控制流图中的任意n点连通子图的出入度序列相同时,则表明两个控制流图是同构的,进而表明源程序与目标程序是相同的,并得到编译器是安全的结果;反之,则证明编译器是不安全的。...

【技术特征摘要】

【专利技术属性】
技术研发人员:冯素梅刘建龙李幼媛袁劲涛杨晓豫赵云飞
申请(专利权)人:北京广利核系统工程有限公司中国广核集团有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1