一种基于中间语言分析的控制流完整性保护方法及系统与流程

文档序号:14156922阅读:245来源:国知局

本发明涉及计算机技术领域,更具体地,涉及一种基于中间语言分析的控制流完整性保护方法及系统。



背景技术:

缓冲区溢出漏洞一直是计算机软件存在的问题。通过利用缓冲区溢出漏洞,攻击者能对内存任意读写,从而修改代码指针,最终劫持控制流以完成攻击意图。控制流劫持攻击和防御是近几年学术研究的热点。为了保护内存安全,学术和工业界不断研究并部署有效的保护措施。已有很多保护措施被广泛采纳,如dep(dataexecutionprevention)、aslr(addressspacelayoutrandomization)、gs/ssp(stacksmashingprotector)和safeseh(safestructuredexceptionhandling)。但仍有多项攻击技术,可以绕过以上这些保护措施。为此,控制流完整性的概念被提出。控制流完整性保护不直接保护内存安全,而是检查控制流是否被劫持,从而判断是否受到攻击。控制流完整性保护方案通常会在程序运行之前为程序生成一个控制流图,在程序运行时利用已生成的控制流图来监控程序的行为,以确保程序控制流符合控制流图。当发现程序控制流不符合控制流图时,通常的做法就是发出警告并终止程序。

传统上,控制流劫持攻击以ret指令、间接jmp指令和间接call指令为目标控制程序指针。目前,越来越多的攻击者开始使用c++应用中的虚调用作为攻击目标。在针对chrome的攻击中,80%的攻击利用user-after-free漏洞和虚函数调用;并且,chrome中91.8%的间接调用为虚函数调用。50%的针对window7的攻击利用user-after-free漏洞和虚函数调用。新的攻击方式coop可以绕过没有考虑c++语义的防护手段,通过修改虚表指针(vptr)在不改变原有控制流的情况下构建攻击。

针对虚表劫持攻击,学术界分别提出了针对二进制程序和源代码的解决方案。源代码层的解决方案,通过分析源代码可以获取类继承结构的信息,在函数的调用点和被调用点插入由函数名、参数列表、修饰符和类型信息编码生成的哈希值,在函数调用时通过匹配函数的哈希值来判断调用的合法性。基于源代码的解决方案无法应用于缺少源代码的二进制应用程序。基于二进制的解决方案,通过数据流可控制流分析,分析出虚表和类继承结构,虚函数被调用时,判断虚表指针是否指向正确的虚表。缺点是无法从二进制完全恢复出所有虚表。另一种基于二进制的解决方案,通过分析汇编代码,确定函数调用点和被调用点的参数比较来判断是否受到续表劫持攻击。这两种方案的都属于粗粒度的解决方案。

综上所述,现有的针虚表劫持攻击的控制流完整性保护方法存在以下不足:源代码层的解决方案无法对二进制应用程序进行保护,二进制层的解决方案粒度太大,可能会到精心设计的虚表劫持攻击的威胁。



技术实现要素:

针对现有技术的缺陷,本发明的目的在于解决现有的针虚表劫持攻击的控制流完整性保护方法存在以下不足:源代码层的解决方案无法对二进制应用程序进行保护,二进制层的解决方案粒度太大,可能会到精心设计的虚表劫持攻击的威胁的技术问题。

为实现上述目的,第一方面,本发明提供一种基于中间语言分析的控制流完整性保护方法,包括:

将源代码翻译成llvm中间语言(llvmintermediaterepresentation);将二进制程序反汇编成llvm中间语言,llvm中间语言生成的二进制程序被执行时的跳转信息对应基于llvm中间语言分析生成的控制流;基于llvm中间语言中函数的信息,生成调用点哈希值和被调用点的哈希值,所述调用点的哈希值和所述被调用点的哈希值相同;将llvm中间语言汇编为汇编代码,并将调用点哈希值和被调用点的哈希值插入汇编代码,生成可执行程序,所述调用点哈希值和被调用点的哈希值用于在所述可执行程序运行时检查其是否受到攻击;当所述可执行程序受到攻击时,所述调用点哈希值和被调用点的哈希值不匹配,所述控制流不完整,停止运行所述可执行程序。

可选地,将源代码翻译成llvm中间语言,包括:确定组成源代码的字符流,并将所述字符流组织成词素序列,对于每个词素产生对应的词法单元作为输出,所述词法单元的第一分量对应该词素的抽象符号,所述词法单元的第二分量指向符号表中关于这个词法单元的条目,所述符号表用于存放第一个分量相关的信息;使用各个词法单元的第一个分量来创建树形的中间表示,所述树形的中间表示给出了所有词法单元的语法结构:抽象语法树;使用抽象语法树和符号表中的信息来检查源代码是否和源代码所使用的编程语言定义的语义一致,若一致,则基于抽象语法树和符号表中信息生成llvm中间语言。

可选地,将二进制程序反汇编成llvm中间语言,包括:反汇编二进制程序并生成控制流图(controlflowgraph,cfg)文件;将cfg文件转化为llvm中间语言。

可选地,llvm中间语言中函数的信息包括:函数名、参数列表、函数返回类型和函数所属库。

第二发明,本发明提供一种基于中间语言分析的控制流完整性保护系统,包括:

源代码翻译模块,用于将源代码翻译成llvm中间语言;

二进制反汇编模块,用于将二进制程序反汇编成llvm中间语言,llvm中间语言生成的二进制程序被执行时的跳转信息对应基于llvm中间语言分析生成的控制流;

函数类型哈希值生成模块,用于基于llvm中间语言中函数的信息,生成调用点哈希值和被调用点的哈希值,所述调用点的哈希值和所述被调用点的哈希值相同;

函数类型检查部署模块,用于将llvm中间语言汇编为汇编代码,并将调用点哈希值和被调用点的哈希值插入汇编代码,生成可执行程序,所述调用点哈希值和被调用点的哈希值用于在所述可执行程序运行时检查其是否受到攻击;当所述可执行程序受到攻击时,所述调用点哈希值和被调用点的哈希值不匹配,所述控制流不完整,停止运行所述可执行程序。

可选地,源代码翻译模块,用于确定组成源代码的字符流,并将所述字符流组织成词素序列,对于每个词素产生对应的词法单元作为输出,所述词法单元的第一分量对应该词素的抽象符号,所述词法单元的第二分量指向符号表中关于这个词法单元的条目,所述符号表用于存放第一个分量相关的信息;使用各个词法单元的第一个分量来创建树形的中间表示,所述树形的中间表示给出了所有词法单元的语法结构:抽象语法树;使用抽象语法树和符号表中的信息来检查源代码是否和源代码所使用的编程语言定义的语义一致,若一致,则基于抽象语法树和符号表中信息生成llvm中间语言。

可选地,二进制反汇编模块用于反汇编二进制程序并生成控制流图cfg文件;将cfg文件转化为llvm中间语言。

可选地,llvm中间语言中函数的信息包括:函数名、参数列表、函数返回类型和函数所属库。

总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下有益效果:

(1)实用性:本发明适用于源代码和二进制程序,基于中间语言分析获取用来匹配的哈希值,不依赖源代码分析和二进制程序分析。当可执行程序受到攻击时,调用点哈希值和被调用点的哈希值不匹配,控制流不完整,停止运行可执行程序,以保证控制流的完整性。因此,本发明具有较高的实用性。

(2)创新性:本发明是第一个通过对llvm中间语言分析同时保护源代码和二进制应用的解决方法。

(3)模块化支持。本发明匹配规则简单,调用点和被调用点的哈希值可以分别生成,不相互依赖。所以只需要对动态链接库进行同样的保护生成对应的哈希值,库函数被调用时,匹配调用点和被调用点的哈希值。因此,本发明支持模块化。

(4)增量编译。本发明通过匹配函数调用点和被调用点的哈希值来确定控制流的完整性。调用点和被调用点的哈希值生成不相互依赖,因此本发明支持增量编译。

(5)低开销。本发明在运行时匹配汇编时插入的哈希值,不需对程序进行动态的控制流追踪和检查,因此引入的运行时开销非常低,能够忽略不计。

附图说明

图1是本发明提供的基于中间语言分析的控制流完整性保护方法流程图;

图2是本发明提供的基于中间语言分析的控制流完整性保护系统整体架构图;

图3是本发明提供的源代码翻译模块的工作流程图;

图4是本发明提供的二进制反汇编模块的工作流程图;

图5是本发明提供的函数类型哈希值生成模块工作流程图;

图6是本发明提供的函数类型检查部署模块工作流程图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

本发明提供了一种基于中间语言分析的控制流完整性保护方法及系统,其目的在于,解决现有针对二进制程序的控制流保护方法中出现的上述局限和不足,保证保护方法的透明性、兼容性和模块化支持,并且同时对源代码和二进制程序的控制流提供保护。

为实现上述目的,本发明提供了一种基于中间语言分析的控制流完整性保护方法,如图1所示,包括以下步骤:

s1,将源代码翻译成llvm中间语言(llvmintermediaterepresentation)。

s2,将二进制程序反汇编成llvm中间语言,llvm中间语言生成的二进制程序被执行时的跳转信息对应基于llvm中间语言分析生成的控制流。

s3,基于llvm中间语言中函数的信息,生成调用点哈希值和被调用点的哈希值,所述调用点的哈希值和所述被调用点的哈希值相同。

s4,将llvm中间语言汇编为汇编代码,并将调用点哈希值和被调用点的哈希值插入汇编代码,生成可执行程序,所述调用点哈希值和被调用点的哈希值用于在所述可执行程序运行时检查其是否受到攻击。

s5,当所述可执行程序受到攻击时,所述调用点哈希值和被调用点的哈希值不匹配,所述控制流不完整,停止运行所述可执行程序。

可选地,将源代码翻译成llvm中间语言,包括:确定组成源代码的字符流,并将所述字符流组织成词素序列,对于每个词素产生对应的词法单元作为输出,所述词法单元的第一分量对应该词素的抽象符号,所述词法单元的第二分量指向符号表中关于这个词法单元的条目,所述符号表用于存放第一个分量相关的信息;使用各个词法单元的第一个分量来创建树形的中间表示,所述树形的中间表示给出了所有词法单元的语法结构:抽象语法树;使用抽象语法树和符号表中的信息来检查源代码是否和源代码所使用的编程语言定义的语义一致,若一致,则基于抽象语法树和符号表中信息生成llvm中间语言。

可选地,将二进制程序反汇编成llvm中间语言,包括:反汇编二进制程序并生成控制流图(controlflowgraph,cfg)文件;将cfg文件转化为llvm中间语言。

可选地,llvm中间语言中函数的信息包括:函数名、参数列表、函数返回类型和函数所属库。

相应地,本发明提供了一种基于中间语言分析的控制流完整性保护系统,其架构图如图2所示,包括:源代码翻译模块、二进制反汇编模块、函数类型哈希值生成模块以及函数类型检查部署模块。

源代码翻译模块,用于将源代码翻译成llvm中间语言。

二进制反汇编模块,用于将二进制程序反汇编成llvm中间语言,llvm中间语言生成的二进制程序被执行时的跳转信息对应基于llvm中间语言分析生成的控制流。

函数类型哈希值生成模块,用于基于llvm中间语言中函数的信息,生成调用点哈希值和被调用点的哈希值,所述调用点的哈希值和所述被调用点的哈希值相同。

函数类型检查部署模块,用于将llvm中间语言汇编为汇编代码,并将调用点哈希值和被调用点的哈希值插入汇编代码,生成可执行程序,所述调用点哈希值和被调用点的哈希值用于在所述可执行程序运行时检查其是否受到攻击;当所述可执行程序受到攻击时,所述调用点哈希值和被调用点的哈希值不匹配,控制流不完整,停止运行所述可执行程序。

可选地,源代码翻译模块,用于确定组成源代码的字符流,并将所述字符流组织成词素序列,对于每个词素产生对应的词法单元作为输出,所述词法单元的第一分量对应该词素的抽象符号,所述词法单元的第二分量指向符号表中关于这个词法单元的条目,所述符号表用于存放第一个分量相关的信息;使用各个词法单元的第一个分量来创建树形的中间表示,所述树形的中间表示给出了所有词法单元的语法结构:抽象语法树;使用抽象语法树和符号表中的信息来检查源代码是否和源代码所使用的编程语言定义的语义一致,若一致,则基于抽象语法树和符号表中信息生成llvm中间语言。

具体地,如图3所示,可将源代码翻译模块的功能划分为:

(1)词法分析:词法分析器读入组成源代码的字符流,并将它们组织成词素序列。对于每个词素,词法分析器产生如下形式的词法单元作为输出:<token-name,attribute-value>。词法分析生成的词法单元用于语法分析。词法单元第一分量token-name是一个由语法分析步骤使用的抽象符号,第二个分量attribute-name指向符号表中关于这个词法单元的条目。符号表条目的信息由词法分析器生成,并会被语义分析和中间代码生成步骤使用。

(2)语法分析:语法分析器使用由词法分析器生成的各个词法单元的第一个分量来创建树形的中间表示。该中间表示给出了词法分析产生的词法单元流的语法结构:抽象语法树。

(3)语义分析:语义分析器使用抽象语法树和符号表中的信息来检查源代码是否和语言定义的语义一致。语义分析器同时也收集与符号表中条目相关的类型信息,并把这些类型信息放在抽象语法树或者符号表中。抽象语法树和符号表用于中间代码的生成。

(4)中间代码生成:中间代码生成器基于抽象语法树和符号表中信息生成llvm中间语言。

具体地,如图4所示,二进制反汇编模块:反汇编二进制程序为llvm中间语言,具体步骤如下:

(1)反汇编二进制程序并生成cfg文件;

(2)将cfg文件转化为为llvm中间语言

具体地,如图5所示,函数类型哈希值生成模块:在数调用点和被调用点生成哈希值,具体步骤如下:

基于llvm中间语言中函数的信息:函数名,参数列表,函数返回类型和函数所属库,生成调用点和被调用点的哈希值。

具体地,如图6所示,函数类型检查部署模块:将函数的哈希值插入程序生成的汇编代码,具体步骤如下:

(1)汇编llvm中间语言为汇编代码;

(2)在链接时把函数调用点和被调用点生成的哈希值插入汇编代码,生成可执行程序。

本发明的整体思路在于,将源代码或者二进制应用转化为llvm中间语言,基于llvm中间语言生成函数调用点和被调用点的哈希值(函数名、参数列表、函数返回类型和函数所属库),程序运行时通过匹配函数调用点和被调用点的哈希值是否相等判断应用是否受到了攻击。如果运行时的函数调用点和被调用点的哈希值相等,程序正常执行;如果不相等,说明应用程序受到控制流劫持攻击,应用程序停止执行,保证了控制流的完整性。

本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1