CN102012862A - 基于控制流图逻辑结构对比的编译器验证方法 - Google Patents
基于控制流图逻辑结构对比的编译器验证方法 Download PDFInfo
- Publication number
- CN102012862A CN102012862A CN2010105398854A CN201010539885A CN102012862A CN 102012862 A CN102012862 A CN 102012862A CN 2010105398854 A CN2010105398854 A CN 2010105398854A CN 201010539885 A CN201010539885 A CN 201010539885A CN 102012862 A CN102012862 A CN 102012862A
- Authority
- CN
- China
- Prior art keywords
- control flow
- flow graph
- compiler
- contrast
- verification method
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及一种基于控制流图逻辑结构对比的编译器验证方法,其包括以下步骤:1)构造源代码的控制流图;2)构造目标代码的控制流图;3)使用同构图算法对以上两者的控制流图进行比对。本发明具有以下优点:可有效地检测编译器恶意代码问题;采用基于控制流图分析和同构比较算法,准确程度高。
Description
技术领域
本发明涉及一种基于控制流图逻辑结构对比的编译器验证方法,属于编译器验证技术领域。
背景技术
编译器作为任何软件的产生器,其安全性、可靠性和稳定性起着至关重要的作用。特别是在那些对软件的可靠性要求非常高的特殊环境里面,必须保证编译器编译出来的代码是对程序源代码的正确、真实的反映,保证编译器在编译过程中逻辑上的正确性以及行为上的透明性。
编译器***可信验证主要包括两方面,一方面是编译器的逻辑正确性,即编译器编译的程序在逻辑上符合程序源代码的描述,与程序源代码的逻辑一致;另外一方面是编译器的安全性和可靠性,指编译器在编译程序过程中不会人为地***恶意代码,导致目标程序运行不可靠或者达到某些其他恶意的目的。
编译器的验证技术现在主要处于理论验证阶段,大多采用形式化的方法来证明编译器正确性和可信性。如形式化验证工具Coq proof assistant,它在开发过程中形式化验证编译器可信性;可出具证明的编译器(certified compiler),该方法不是从编译器本身入手,而是从保证被编译程序的正确性入手,它需要编译器在编译源程序时候同时生成一个形式化的证明,该证明能保证,对某个源程序S,编译器生成的目标程序T是S的一个正确转化。
编译器安全漏洞是指人为的编译器后门,为了针对其进行排除和验证,一方面需要依赖形式化验证技术保障编译器的逻辑正确性,另一方面需要利用多遍交叉编译、目标文件结构化比较、目标文件反编译逻辑比较等理论和方法完成对安全性和可靠性的验证。由此提出了一种实践性较强的检测编译器安全漏洞的方案,称为“多遍交叉编译”,它是一种全自动的方案,支持多种编程语言,且不需要复杂的数学证明技术。然而,其不足在于,它不仅需要一个额外的开源编译器作为参考,而且它只能证明编译器源代码及其二进制代码是对应的;它不能保证编译器源代码不存在漏洞。如果编译器源代码本身就存在漏洞,它不能检测出漏洞的存在。
综上,这些形式化验证方法虽然在理论上比较完善,然而在实际应用中存在以下几个主要问题:
1.理论性太强,可行性较差:形式化验证方法在实现上难道非常大,基本停留在理论阶段,往往在实际应用中并不可行;
2.验证范围较小:现有的形式化验证技术,一般仅能应用于某个语言子集或者仅能证明编译器某些特性或某个部分的正确性,无法在工程中推广。
3.都没有能够很好地解决编译器对于恶意代码注入的问题。
发明内容
为了解决这些问题,本发明提供了一种全新的方法,可以验证编译器的安全问题。本发明通过提取程序源代码和目标代码的控制流图,然后使用同构图的算法对它们进行对比,如果它们一致的话则证明编译器没有***逻辑炸弹;如果不一致,则证明编译器可能***了逻辑炸弹,可以在控制流图不一致的结点位置进行手动检查,从而可能发现编译器的后门。
本发明采用的技术方案如下:
一种基于控制流图逻辑结构对比的编译器验证方法,其特征在于包括以下步骤:
1)构造源代码的控制流图;
2)构造目标代码的控制流图;
3)使用同构图算法对以上两者的控制流图进行比对。
在所述步骤1)中,首先对源代码进行词法分析和语法分析,在分析的过程中,根据源代码中语句的语法结构构造出程序的控制流图。
在所述步骤2)中,根据目标代码中影响控制流图结构的指令,将目标代码划分为块,利用所述指令的语义构造其控制流图。
在所述步骤3)中,从两者的控制流图的起始结点开始,按照广度优先遍历的算法对两者的控制流图同时进行遍历。
本发明具有以下优点:
1.可有效地检测编译器恶意代码问题;
2.采用基于控制流图分析和同构比较算法,准确程度高。
附图说明
图1是循环结构流程示意图;
图2是跳转结构流程示意图;
图3是对两个控制流图同时进行遍历的算法。
具体实施方式
本发明提供了一种基于控制流图逻辑结构对比的编译器验证方法,它通过提取程序源代码和目标代码的控制流图,然后使用同构图的算法对它们进行对比,如果它们一致的话则证明编译器没有***逻辑炸弹;如果不一致,则证明编译器可能***了逻辑炸弹,可以在控制流图不一致的结点位置进行手动检查,从而可能发现编译器的后门。
恶意代码由两部分组成,一部分是触发部分,另一部分是负荷部分。这两部分中,触发部分是根据一定的触发条件触发恶意的代码,然后执行负荷部分。编译器如果要在目标代码中***恶意代码,那么触发部分必须有一个前提是它包含一定的条件判断语句,即触发部分会改变目标代码的控制流图;而负荷部分如果要进行一些恶意的活动,它必须调用***的应用编程接口API,比如向网络传输数据的恶意后门程序必定会调用***的send()这样的socket API进行数据的传输,这样的行为也会改变控制流图的结构。
基于这两点前提,考虑将源代码和目标代码的控制流图提取出来,然后使用同构图的算法对它们进行对比。通过对比后的情况来确定两个控制流图的逻辑结构是否一致,也就是确定编译器在编译的过程是否改变程序的结构。如果不一致,则在控制流图不一致的结点位置进行手动检查,从而可能发现编译器的安全漏洞。
所以本发明首先通过Lex&Yacc对编译前的源代码分别进行词法分析和语法分析,根据程序中语句的语法结构构造出程序的控制流图。结构语句有if/else,for,while和函数调用等,此处选取while做为实例来说明控制流图的构造过程:
它在YACC的语法规则中表示为:WHILE’(’expression’)’statement。按照YACC的语法规则参数来看,规则里面的“expression”为参数$3,“statement”的参数为$5,它对控制流图的影响是产生循环结构,产生如图1所示流程图。
对于编译后的目标代码,根据其中的影响控制流图结构的指令,如jmp、je、jg、jle、jlg、call等跳转指令和函数调用指令将代码划分为若干块,并利用这些指令的语义构造其控制流图,如图2左边所示的目标代码,产生图2右边所示的流图。
在构造了源代码和目标代码的控制流图后,使用同构图算法对它们进行对比。普通的同构图算法是个NP问题,但这里构造的控制流图是一个特殊的图,它由一个起始结点和一个结束结点构成,并且最多有两个弧的有向图。通过改造同构图算法,比较源代码和目标代码的控制流图是否同构。
改造的同构图算法首先从控制流图的起始结点开始,按照广度优先遍历的算法对两个控制流图G1和G2同时进行遍历。每遍历到一个结点,假设分别为G1和G2中的n1和n2,便判断它们是否同构。下面对照图3说明具体的操作:
如果n1或者n2的id不为0,并且如果n1或者n2的id相等则返回同构;如果不相等,那么说明曾经有一结点已经被标识或者该遍历路径无法完成同构,则返回不同构;然后判断n1和n2的弧的数量是否相等,如果不相等,则表示该遍历路径无法同构,返回不同构;如果相等,则假设n1和n2是同构路径上的两个相映射的结点,为它们产生一个唯一的标识ID,并且赋值给n1和n2的id。如果n1和n2的弧数量只有一个,那么对它们唯一的弧指向的结点进行递归同构运算,并且返回运算值;如果n1和n2的弧数量有两个,那么任意配对两个弧指向的结点进行递归同构运算,如果形成同构,则返回同构,如果不形成同构,则交换弧的配对方式再进行递归同构运算,并记录返回值;如果还是不能形成同构,则该图的确无法形成同构,返回值设置为不可同构。如果n1和n2的弧数量为0,则表示该节点为结束节点,同构运算递归结束。清空n1和n2的id并且返回返回值。
我们用以上方法来验证GCC编译器,一个是原始的GCC(称为GCC-orgi)和一个经过修改的、会在编译过程中***恶意代码的GCC(GCC-back),我们在词法分析阶段通过改写输入缓冲区的方法达到***恶意代码的目的。
分别用两个编译器对测试程序进行测试,测试程序包括UNIX登录程序login、用户终端程序bash、UNIX密码更改程序passwd和OpenSSH的网络加密库libssl等UNIX/Linux***中较为关键的安全程序。通过测试数据发现控制流图逻辑结构的比较的准确程度非常高,通常在90%左右。
在现有的编译器验证基础上,通过使用控制流图逻辑结构对比的方法,能够比较完善地证明和验证现有编译器的安全性和可靠性,并且能够在实践中得到应用和体现。
Claims (4)
1.一种基于控制流图逻辑结构对比的编译器验证方法,其特征在于包括以下步骤:
1)构造源代码的控制流图;
2)构造目标代码的控制流图;
3)使用同构图算法对以上两者的控制流图进行比对。
2.如权利要求1所述的基于控制流图逻辑结构对比的编译器验证方法,其特征在于:
在所述步骤1)中,首先对源代码进行词法分析和语法分析,然后根据源代码中语句的语法结构构造出程序的控制流图。
3.如权利要求1所述的基于控制流图逻辑结构对比的编译器验证方法,其特征在于:
在所述步骤2)中,根据目标代码中影响控制流图结构的指令,将目标代码划分为块,利用所述指令的语义构造其控制流图。
4.如权利要求1所述的基于控制流图逻辑结构对比的编译器验证方法,其特征在于:
在所述步骤3)中,从两者的控制流图的起始结点开始,按照广度优先遍历的算法对两者的控制流图同时进行遍历。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010105398854A CN102012862A (zh) | 2010-11-09 | 2010-11-09 | 基于控制流图逻辑结构对比的编译器验证方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010105398854A CN102012862A (zh) | 2010-11-09 | 2010-11-09 | 基于控制流图逻辑结构对比的编译器验证方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102012862A true CN102012862A (zh) | 2011-04-13 |
Family
ID=43843038
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010105398854A Pending CN102012862A (zh) | 2010-11-09 | 2010-11-09 | 基于控制流图逻辑结构对比的编译器验证方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102012862A (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8997256B1 (en) | 2014-03-31 | 2015-03-31 | Terbium Labs LLC | Systems and methods for detecting copied computer code using fingerprints |
CN105812394A (zh) * | 2016-05-24 | 2016-07-27 | 王四春 | 一种新型云计算在跨境电商上的应用 |
US9459861B1 (en) | 2014-03-31 | 2016-10-04 | Terbium Labs, Inc. | Systems and methods for detecting copied computer code using fingerprints |
CN106611125A (zh) * | 2016-12-12 | 2017-05-03 | 中国航空工业集团公司洛阳电光设备研究所 | 一种验证编译器安全性的方法 |
CN107066241A (zh) * | 2010-06-15 | 2017-08-18 | 起元技术有限责任公司 | 用于动态加载基于图的计算的***和方法 |
CN108153659A (zh) * | 2016-12-02 | 2018-06-12 | 腾讯科技(深圳)有限公司 | 程序漏洞检测方法及相关装置 |
RU2711041C1 (ru) * | 2019-05-14 | 2020-01-14 | федеральное государственное казенное военное образовательное учреждение высшего образования "Краснодарское высшее военное училище имени генерала армии С.М. Штеменко" Министерства обороны Российской Федерации | Способ анализа программного обеспечения на отсутствие недекларированных функциональных возможностей |
US10901702B2 (en) | 2013-12-05 | 2021-01-26 | Ab Initio Technology Llc | Managing interfaces for sub-graphs |
CN112989339A (zh) * | 2021-02-24 | 2021-06-18 | 西安理工大学 | 一种基于机器学习的gcc编译器恶意代码入侵检测方法 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101271398A (zh) * | 2007-03-23 | 2008-09-24 | 北京大学 | 多路分支结构的识别方法 |
-
2010
- 2010-11-09 CN CN2010105398854A patent/CN102012862A/zh active Pending
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101271398A (zh) * | 2007-03-23 | 2008-09-24 | 北京大学 | 多路分支结构的识别方法 |
Non-Patent Citations (1)
Title |
---|
俞甲子: "GCC编译器安全验证方法研究", <浙江大学计算机学院学位论文》 * |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107066241A (zh) * | 2010-06-15 | 2017-08-18 | 起元技术有限责任公司 | 用于动态加载基于图的计算的***和方法 |
CN107066241B (zh) * | 2010-06-15 | 2021-03-09 | 起元技术有限责任公司 | 用于动态加载基于图的计算的***和方法 |
US10901702B2 (en) | 2013-12-05 | 2021-01-26 | Ab Initio Technology Llc | Managing interfaces for sub-graphs |
US8997256B1 (en) | 2014-03-31 | 2015-03-31 | Terbium Labs LLC | Systems and methods for detecting copied computer code using fingerprints |
US9218466B2 (en) | 2014-03-31 | 2015-12-22 | Terbium Labs LLC | Systems and methods for detecting copied computer code using fingerprints |
US9459861B1 (en) | 2014-03-31 | 2016-10-04 | Terbium Labs, Inc. | Systems and methods for detecting copied computer code using fingerprints |
CN105812394A (zh) * | 2016-05-24 | 2016-07-27 | 王四春 | 一种新型云计算在跨境电商上的应用 |
CN108153659A (zh) * | 2016-12-02 | 2018-06-12 | 腾讯科技(深圳)有限公司 | 程序漏洞检测方法及相关装置 |
CN106611125A (zh) * | 2016-12-12 | 2017-05-03 | 中国航空工业集团公司洛阳电光设备研究所 | 一种验证编译器安全性的方法 |
RU2711041C1 (ru) * | 2019-05-14 | 2020-01-14 | федеральное государственное казенное военное образовательное учреждение высшего образования "Краснодарское высшее военное училище имени генерала армии С.М. Штеменко" Министерства обороны Российской Федерации | Способ анализа программного обеспечения на отсутствие недекларированных функциональных возможностей |
CN112989339A (zh) * | 2021-02-24 | 2021-06-18 | 西安理工大学 | 一种基于机器学习的gcc编译器恶意代码入侵检测方法 |
CN112989339B (zh) * | 2021-02-24 | 2023-05-02 | 西安理工大学 | 一种基于机器学习的gcc编译器恶意代码入侵检测方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102012862A (zh) | 基于控制流图逻辑结构对比的编译器验证方法 | |
Feist et al. | Slither: a static analysis framework for smart contracts | |
Salis et al. | Pycg: Practical call graph generation in python | |
Burnim et al. | Heuristics for scalable dynamic test generation | |
CN103577324B (zh) | 移动应用中隐私信息泄露的静态检测方法 | |
Soeken et al. | Verifying dynamic aspects of UML models | |
Prabhu et al. | Interprocedural exception analysis for C++ | |
Clark et al. | Semantic mutation testing | |
CN104021084A (zh) | 一种Java源代码缺陷检测方法及装置 | |
CN103559125A (zh) | 一种利用图同构验证编译器的方法 | |
Charif-Rubial et al. | MIL: A language to build program analysis tools through static binary instrumentation | |
Li et al. | Path-sensitive and alias-aware typestate analysis for detecting os bugs | |
CN106295343A (zh) | 一种基于序列化中间表示的源代码分布式检测***及方法 | |
CN104714829A (zh) | 一种保证目标码和源代码一致性的编译链接方法 | |
Perez et al. | Generating predicate callback summaries for the android framework | |
Namjoshi et al. | A witnessing compiler: A proof of concept | |
Xu et al. | Testing aspect‐oriented programs with finite state machines | |
CN102520949A (zh) | 形式化计算机联锁实现方法 | |
Chakrabarti et al. | Software partitioning for effective automated unit testing | |
Jezek et al. | Software components compatibility verification based on static byte-code analysis | |
Brucker et al. | Interactive testing with HOL-TestGen | |
Liu et al. | A survey of search strategies in the dynamic symbolic execution | |
Abdulkhaleq et al. | A systematic and semi-automatic safety-based test case generation approach based on systems-theoretic process analysis | |
Liva et al. | Automatic repair of timestamp comparisons | |
Chen et al. | Jasmine: A Static Analysis Framework for Spring Core Technologies |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20110413 |