基于控制流图逻辑结构对比的编译器验证方法

文档序号:6335685阅读:364来源:国知局
专利名称:基于控制流图逻辑结构对比的编译器验证方法
技术领域
本发明涉及一种基于控制流图逻辑结构对比的编译器验证方法,属于编译器验 证技术领域。
背景技术
编译器作为任何软件的产生器,其安全性、可靠性和稳定性起着至关重要的作 用。特别是在那些对软件的可靠性要求非常高的特殊环境里面,必须保证编译器编译出 来的代码是对程序源代码的正确、真实的反映,保证编译器在编译过程中逻辑上的正确 性以及行为上的透明性。编译器系统可信验证主要包括两方面,一方面是编译器的逻辑正确性,即编译 器编译的程序在逻辑上符合程序源代码的描述,与程序源代码的逻辑一致;另外一方面 是编译器的安全性和可靠性,指编译器在编译程序过程中不会人为地插入恶意代码,导 致目标程序运行不可靠或者达到某些其他恶意的目的。编译器的验证技术现在主要处于理论验证阶段,大多采用形式化的方法来证明 编译器正确性和可信性。如形式化验证工具Coq proof assistant,它在开发过程中形式化 验证编译器可信性;可出具证明的编译器(certified compiler),该方法不是从编译器本身 入手,而是从保证被编译程序的正确性入手,它需要编译器在编译源程序时候同时生成 一个形式化的证明,该证明能保证,对某个源程序S,编译器生成的目标程序T是S的一 个正确转化。编译器安全漏洞是指人为的编译器后门,为了针对其进行排除和验证,一方面 需要依赖形式化验证技术保障编译器的逻辑正确性,另一方面需要利用多遍交叉编译、 目标文件结构化比较、目标文件反编译逻辑比较等理论和方法完成对安全性和可靠性的 验证。由此提出了一种实践性较强的检测编译器安全漏洞的方案,称为“多遍交叉编 译”,它是一种全自动的方案,支持多种编程语言,且不需要复杂的数学证明技术。然 而,其不足在于,它不仅需要一个额外的开源编译器作为参考,而且它只能证明编译器 源代码及其二进制代码是对应的;它不能保证编译器源代码不存在漏洞。如果编译器源 代码本身就存在漏洞,它不能检测出漏洞的存在。综上,这些形式化验证方法虽然在理论上比较完善,然而在实际应用中存在以 下几个主要问题1.理论性太强,可行性较差形式化验证方法在实现上难道非常大,基本停留 在理论阶段,往往在实际应用中并不可行;2.验证范围较小现有的形式化验证技术,一般仅能应用于某个语言子集或者 仅能证明编译器某些特性或某个部分的正确性,无法在工程中推广。3.都没有能够很好地解决编译器对于恶意代码注入的问题。

发明内容
为了解决这些问题,本发明提供了一种全新的方法,可以验证编译器的安全问 题。本发明通过提取程序源代码和目标代码的控制流图,然后使用同构图的算法对它们 进行对比,如果它们一致的话则证明编译器没有插入逻辑炸弹;如果不一致,则证明编 译器可能插入了逻辑炸弹,可以在控制流图不一致的结点位置进行手动检查,从而可能 发现编译器的后门。本发明采用的技术方案如下一种基于控制流图逻辑结构对比的编译器验证方法,其特征在于包括以下步骤1)构造源代码的控制流图;2)构造目标代码的控制流图;3)使用同构图算法对以上两者的控制流图进行比对。在所述步骤1)中,首先对源代码进行词法分析和语法分析,在分析的过程中, 根据源代码中语句的语法结构构造出程序的控制流图。在所述步骤2)中,根据目标代码中影响控制流图结构的指令,将目标代码划分 为块,利用所述指令的语义构造其控制流图。在所述步骤3)中,从两者的控制流图的起始结点开始,按照广度优先遍历的算 法对两者的控制流图同时进行遍历。本发明具有以下优点1.可有效地检测编译器恶意代码问题;2.采用基于控制流图分析和同构比较算法,准确程度高。


图1是循环结构流程示意图;图2是跳转结构流程示意图;图3是对两个控制流图同时进行遍历的算法。
具体实施例方式本发明提供了一种基于控制流图逻辑结构对比的编译器验证方法,它通过提取 程序源代码和目标代码的控制流图,然后使用同构图的算法对它们进行对比,如果它们 一致的话则证明编译器没有插入逻辑炸弹;如果不一致,则证明编译器可能插入了逻辑 炸弹,可以在控制流图不一致的结点位置进行手动检查,从而可能发现编译器的后门。恶意代码由两部分组成,一部分是触发部分,另一部分是负荷部分。这两部分 中,触发部分是根据一定的触发条件触发恶意的代码,然后执行负荷部分。编译器如果 要在目标代码中插入恶意代码,那么触发部分必须有一个前提是它包含一定的条件判断语 句,即触发部分会改变目标代码的控制流图;而负荷部分如果要进行一些恶意的活动,它 必须调用系统的应用编程接口 API,比如向网络传输数据的恶意后门程序必定会调用系统 的sendO这样的socketAPI进行数据的传输,这样的行为也会改变控制流图的结构。基于这两点前提,考虑将源代码和目标代码的控制流图提取出来,然后使用同 构图的算法对它们进行对比。通过对比后的情况来确定两个控制流图的逻辑结构是否一致,也就是确定编译器在编译的过程是否改变程序的结构。如果不一致,则在控制流图 不一致的结点位置进行手动检查,从而可能发现编译器的安全漏洞。所以本发明首先通过Lex&Yacc对编译前的源代码分别进行词法分析和语法分 析,根据程序中语句的语法结构构造出程序的控制流图。结构语句有if/else,for, while 和函数调用等,此处选取while做为实例来说明控制流图的构造过程它在YACC 的语法规则中表示为WHILE’ (,expression,),statement。按 照YACC的语法规则参数来看,规则里面的“expression”为参数$3,“statement”的 参数为$5,它对控制流图的影响是产生循环结构,产生如图1所示流程图。对于编译后的目标代码,根据其中的影响控制流图结构的指令,如jmp、je、 jg、jle、jig、call等跳转指令和函数调用指令将代码划分为若干块,并利用这些指令的语 义构造其控制流图,如图2左边所示的目标代码,产生图2右边所示的流图。在构造了源代码和目标代码的控制流图后,使用同构图算法对它们进行对比。 普通的同构图算法是个NP问题,但这里构造的控制流图是一个特殊的图,它由一个起始 结点和一个结束结点构成,并且最多有两个弧的有向图。通过改造同构图算法,比较源 代码和目标代码的控制流图是否同构。改造的同构图算法首先从控制流图的起始结点开始,按照广度优先遍历的算法 对两个控制流图Gl和G2同时进行遍历。每遍历到一个结点,假设分别为Gl和G2中 的nl和n2,便判断它们是否同构。下面对照图3说明具体的操作如果nl或者n2的id不为0,并且如果nl或者n2的id相等则返回同构;如果 不相等,那么说明曾经有一结点已经被标识或者该遍历路径无法完成同构,则返回不同 构;然后判断nl和n2的弧的数量是否相等,如果不相等,则表示该遍历路径无法同构, 返回不同构;如果相等,则假设nl和n2是同构路径上的两个相映射的结点,为它们产生 一个唯一的标识ID,并且赋值给nl和n2的id。如果nl和n2的弧数量只有一个,那么 对它们唯一的弧指向的结点进行递归同构运算,并且返回运算值;如果nl和n2的弧数量 有两个,那么任意配对两个弧指向的结点进行递归同构运算,如果形成同构,则返回同 构,如果不形成同构,则交换弧的配对方式再进行递归同构运算,并记录返回值;如果 还是不能形成同构,则该图的确无法形成同构,返回值设置为不可同构。如果nl和n2 的弧数量为0,则表示该节点为结束节点,同构运算递归结束。清空nl和n2的id并且 返回返回值。我们用以上方法来验证GCC编译器,一个是原始的GCC (称为GCC-orgi)和一 个经过修改的、会在编译过程中插入恶意代码的GCC(GCC-back),我们在词法分析阶段 通过改写输入缓冲区的方法达到插入恶意代码的目的。分别用两个编译器对测试程序进行测试,测试程序包括UNIX登录程序login、 用户终端程序bash、UNIX密码更改程序passwd和OpenSSH的网络加密库Iibssl等UNIX/
Linux系统中较为关键的安全程序。通过测试数据发现控制流图逻辑结构的比较的准确程
度非常高,通常在90%左右。在现有的编译器验证基础上,通过使用控制流图逻辑结构对比的方法,能够比 较完善地证明和验证现有编译器的安全性和可靠性,并且能够在实践中得到应用和体 现。
权利要求
1.一种基于控制流图逻辑结构对比的编译器验证方法,其特征在于包括以下步骤1)构造源代码的控制流图;2)构造目标代码的控制流图;3)使用同构图算法对以上两者的控制流图进行比对。
2.如权利要求1所述的基于控制流图逻辑结构对比的编译器验证方法,其特征在于在所述步骤1)中,首先对源代码进行词法分析和语法分析,然后根据源代码中语句 的语法结构构造出程序的控制流图。
3.如权利要求1所述的基于控制流图逻辑结构对比的编译器验证方法,其特征在于在所述步骤2)中,根据目标代码中影响控制流图结构的指令,将目标代码划分为 块,利用所述指令的语义构造其控制流图。
4.如权利要求1所述的基于控制流图逻辑结构对比的编译器验证方法,其特征在于在所述步骤3)中,从两者的控制流图的起始结点开始,按照广度优先遍历的算法对 两者的控制流图同时进行遍历。
全文摘要
本发明涉及一种基于控制流图逻辑结构对比的编译器验证方法,其包括以下步骤1)构造源代码的控制流图;2)构造目标代码的控制流图;3)使用同构图算法对以上两者的控制流图进行比对。本发明具有以下优点可有效地检测编译器恶意代码问题;采用基于控制流图分析和同构比较算法,准确程度高。
文档编号G06F9/45GK102012862SQ20101053988
公开日2011年4月13日 申请日期2010年11月9日 优先权日2010年11月9日
发明者于鹏珊, 付小朋, 任永青, 程胜 申请人:北京神舟航天软件技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1