一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于函数动态载入的代码重用攻击防御方法

2022-07-17 00:02:48 来源:中国专利 TAG:


1.本技术属于软件漏洞防御领域,具体涉及一种基于函数动态载入的代码重用攻击防御方法。


背景技术:

2.软件漏洞以其高威胁、难防御、普遍存在等特点,被作为一种战略资源,广泛用于攻防博弈中。其中缓冲区溢出漏洞便是其中的代表之一,一直是被攻击者利用的重灾区。具体来讲,攻击者通过缓冲区溢出漏洞获得一个指令指针的控制权,通过连接程序本身的代码片段(通常称之为gadget)后劫持控制流,改变寄存器状态达到系统调用的代码重用攻击的目的。现有的方法主要有控制流完整性(cfi)、内存布局随机化和软件去膨胀技术三种。cfi通过分析程序正常控制流,构造程序的控制流图,在程序运行中限制控制流的转移只能在原有控制流图所限定的范围内,从而保证控制流的正确转移。但cfi建立在对程序的深刻理解上,往往需要源代码或调试信息;在运行动态监测时,cfi无法完美刻画进程的控制流图(cfg),因此可能导致限制程序正常运行或允许程序执行非法操作;在运行时cfi需要比对跳转指令的目标地址,导致较大性能开销。针对获取代码片段位置信息的情况,当前有内存布局随机化(aslr)防御机制。内存布局随机化通过在运行前或运行时改变程序的内存布局,增大攻击者找到可利用gadget的难度,降低攻击者成功的概率。但内存的随机化仅达到页一级,页内数据仍然是顺序存储的,容易被暴力破解;同时aslr会面临内存泄漏攻击的威胁。


技术实现要素:

3.基于上述问题,本技术提出了一种基于函数动态载入的代码重用攻击防御方案,在程序执行过程中对载入到内存中的函数块进行数量上的限制,并对已加载函数块进行换入换出以确保内存中只驻存部分代码,以减少内存中驻留的gadget数量。技术方案为,一种基于函数动态载入的代码重用攻击防御方法,包括以下步骤,s1.预处理二进制可执行文件,识别函数块起始地址和大小、识别段信息、定义并识别合规地址;以gadget的功能对其进行分类,并提取对应类型gadget指令的机器码特征,以便搜索可执行文件中的gadget;s2.引入局部控制流完整性的函数动态载入方案;s3.引入gadget语义的函数动态卸载方案。
4.优选的,步骤s1中,s11.加载二进制可执行文件并初始化预备区域和执行区域,将入口地址设置为程序起始地址;s12.在程序运行过程中维护预备区域和执行区域两块内存以实现函数的动态载入,预备区域包含程序运行需要的所有函数信息,执行区域是可执行文件的代码段,该区域置空,即程序在刚开始运行时,代码段是没有可用函数的,在函数运行过程中,根据运行需
要从预备区域依次载入函数到执行区域执行。
5.优选的,步骤s2中,局部即载入地址的局部,局部控制流完整性就是确保载入函数这个过程要符合程序正常的控制流,具体步骤为:s21.定义了合规地址集合,合规地址是一系列的地址,包括函数的起始地址、call指令的返回地址和跳转到其他函数的目标地址,在程序的正常控制流中,只有通过新函数的调用、函数返回和跳转到新函数这三种方式的任一种才能进入或退出一个函数;s22.在程序执行到一个尚未加载的地址时,加载器收到信号,知道这个地址处需要加载一个函数,判断该地址是否属于上述的合规地址集合,如果是,则从预备区域查找这个地址,将该地址所在的函数写入到执行区域,程序继续执行;如果不是,则说明该控制流违反了完整性,程序报错并停止运行。
6.优选的,步骤s3中,s31.在动态加载程序的同时,加载器记录载入函数的数量,如果载入函数数量达到设定的程序总函数数量的阈值时,触发卸载,按照载入顺序卸载最开始载入的函数;s32.在加载函数的过程中,gadget监视器会记录载入的gadget,并尝试构建gadget链,若现有gadget能够构建gadget链,则计算该gadget链中数量最少的gadget类型,将包含该类型gadget的函数卸载;若现有gadget不能够构建gadget链,则认为现有gadget无法执行一次代码重用攻击,程序正常运行。
7.有益效果在程序运行时根据运行需要对函数进行载入,并及时卸载部分函数,有效的减少了运行时内存中的gadget数量,同时避免了现有gadget被利用,以较小的性能开销实现了代码重用攻击的防御。通过测试集spuc cpu 2006进行实验,在性能开销方面,仅产生1.4%的时间开销,减少了程序中94.6%的gadget。
附图说明
8.图1为本技术流程图。
9.图2为本技术数据流示意图。
10.图3为时间开销图;以程序函数总量的1/8,1/16,1/32为载入上限,通过测试集spuc cpu 2006进行实验,设置实验次数为100次以减小运行过程中的误差,得到本方法的运行时间开销。时间开销以程序本身的运行时间为基准,计算超出的时间。比如,测试程序正常运行时间为100秒,本方法运行该测试程序用了101秒,则时间开销为1%。
11.图4为时间开销对比(travight是本方法);实验设置同图3的实验,对比方法来自于近几年ccf-a、ccf-b高水平学术期刊会论文中的方法。
12.图5为gadget减少数量效果对比(travight是本方法)。以程序函数总量的1/16为载入上限,首先测得程序中原有的gadget数量,然后测得本方法在程序运行不同时刻下的gadget数量,最后求得运行过程中内存中的gadget平均值,得到gadget减少数量=1-本方法中的gadget数量/gadget总数量(%)。对比方法来自于近几年ccf-a、ccf-b高水平学术期刊会论文中的方法。如程序原有gadget共1000个,本方法在运行过程中测得程序的gadget数量平均为100个,则减少数量为900/1000=90%,减少了程序中90%的gadget。
13.图6为gadget链构建规则。
具体实施方式
14.以下详细说明都是例示性的,旨在对本技术提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本技术所属技术领域的普通技术人员通常理解的相同含义。需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本技术的示例性实施方式。
15.本发明提供了一种基于函数动态载入的代码重用攻击防御方案,所述方法包括:s1.预处理二进制可执行文件,识别函数块起始地址和大小、识别段信息、定义并识别合规地址;以gadget的功能对其进行分类,并提取对应类型gadget指令的机器码特征,以便搜索可执行文件中的gadget;以gadget的功能对gadget进行分类:包括算数和逻辑运算类型、寄存器赋值类型、读内存类型、写内存类型、系统调用类型、跳转类型。相应类型gadget指令的机器码特征(如系统调用类型gadget的机器码特征为:0f05,跳转类型gadget的机器码特征为:7[0-f],算数和逻辑运算类型机器码:8[0-3],寄存器赋值类型机器码:8[8-c],读内存类型机器码:5[8-f],写内存类型机器码:5[0-7]),识别出文件中存在的gadget。
[0016]
加载二进制可执行文件并初始化预备区域和执行区域,将入口地址设置为程序起始地址。在程序运行过程中维护预备区域和执行区域两块内存以实现函数的动态载入,预备区域包含程序运行需要的所有函数信息,执行区域是可执行文件的代码段,该区域置空,即程序在刚开始运行时,代码段是没有可用函数的,在函数运行过程中,根据运行需要从预备区域依次载入函数到执行区域执行。
[0017]
s2.为了确保加载函数的安全性,本技术定义了局部控制流完整性的概念,局部即载入地址这个局部,局部控制流完整性就是确保载入函数这个过程要符合程序正常的控制流,为了实现这个目的,我们定义了合规地址集合,合规地址是一系列的地址,包括函数的起始地址、call指令的返回地址和跳转到其他函数的目标地址,因为在程序的正常控制流中,只有通过新函数的调用、函数返回和跳转到新函数这三种方式任一种才能进入或退出一个函数。
[0018]
在程序执行到一个尚未加载的地址时,加载器收到信号,知道这个地址处需要加载一个函数,判断该地址是否属于上述的合规地址集合,如果是,则从预备区域查找这个地址,将该地址所在的函数写入到执行区域,程序继续执行。如果不是,则说明该控制流违反了完整性,程序报错并停止运行。
[0019]
s3.在动态加载程序的同时,加载器记录载入函数的数量,如果载入函数数量达到程序总函数数量的1/16时,就会触发卸载,按照载入顺序卸载最开始载入的函数。
[0020]
在加载函数的过程中,gadget监视器会记录载入的gadget,并尝试构建gadget链。若现有gadget能够构建gadget链,则计算该gadget链中数量最少的gadget类型,将包含该类型gadget的函数卸载。若现有gadget不能够构建gadget链,则认为现有gadget无法执行一次代码重用攻击,程序正常运行。
[0021]
表1所示gadget减少数量
表1为运行时gadget减少程度的实验结果,实验测试集为spuc cpu 2006,对测试集中的不同测试程序进行实验,以程序函数总量的1/16为载入上限,首先测得程序中原有的gadget数量,然后测得本方法在程序运行不同时刻下的gadget数量,最后求得运行过程中内存中的gadget平均值,得到gadget减少数量=1-本方法中的gadget数量/gadget总数量(%)图3为时间开销图;以程序函数总量的1/8,1/16,1/32为载入上限, 通过测试集spuc-cpu-2006进行实验,设置实验次数为100次以减小运行过程中的误差,得到本方法的运行时间开销。时间开销以程序本身的运行时间为基准,计算超出的时间。比如,测试程序正常运行时间为100秒,本方法运行该测试程序用了101秒,则时间开销为1%。
[0022]
图4为时间开销对比(travight是本方法);实验设置同图3的实验,对比方法来自于近几年ccf-a、ccf-b高水平学术期刊会论文中的方法(如现有技术上blankit方法、现有技术bci-cfi方法、现有技术rcfi方法、现有技术barra方法和现有技术hurdle方法)。
[0023]
图5为gadget减少数量效果对比(travight是本方法)。以程序函数总量的1/16为载入上限,首先测得程序中原有的gadget数量,然后测得本方法在程序运行不同时刻下的gadget数量,最后求得运行过程中内存中的gadget平均值,得到gadget减少数量=1-本方法中的gadget数量/gadget总数量(%)。对比方法来自于近几年ccf-a、ccf-b高水平学术期刊会论文中的方法(如现有技术ropstarvation方法、现有技术piece-wise方法、现有技术nibboer方法、现有技术blankit方法)。如程序原有gadget共1000个,本方法在运行过程中测得程序的gadget数量平均为100个,则减少数量为900/1000=90%,减少了程序中90%的gadget。
[0024]
如图6,构建的gadget链可用抽象出的gadget类型表示,通过执行一个或多个读内存类型的gadget,再执行算数和逻辑运算、写内存、寄存器赋值、跳转类型中的一种或多种,最后执行系统调用类型gadget。
[0025]
以上所述仅为本技术的优选实施例而已,并不用于限制本技术,对于本领域的技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献