缓冲区溢出漏洞自动修复方法与流程

文档序号:13253193阅读:550来源:国知局
技术领域本发明属于软件工程领域,尤其涉及一种缓冲区溢出漏洞自动修复方法。

背景技术:
缓冲区是指一个程序在运行期间在内存中分配的一个连续的存储空间,该存储空间用于存放各种类型的数据。缓冲区溢出是指如果用户输入的数据长度超出了程序为其分配的内存空间,这些数据就会覆盖程序为其它数据分配的内存空间,造成缓冲区溢出。缓冲区溢出漏洞是最常见的软件安全漏洞之一,对软件中存在的缓冲区溢出漏洞进行修复是保证软件安全的重要手段。软件漏洞自动修复属于软件维护的范畴。目前缓冲区溢出漏洞的修复在很大程度上需要人工的参与,会耗费较多人力,延长软件维护耗费的时间,增加软件维护成本。

技术实现要素:
针对现有技术中存在的问题,本发明提出一种缓冲区溢出漏洞自动修复方法,通过建立缓冲区溢出模型并具此提出相应的修复方法,来自动修复程序中已知的缓冲区溢出漏洞。为了实现上述发明目的,其采用的技术方案为:首先读取并解析已经通过人工确认或者通过缓冲区溢出检测工具确认过的缓冲区溢出漏洞报告文件,该文件包含缓冲区溢出漏洞的源文件名、溢出漏洞代码所在的行号、溢出漏洞代码所使用的API,根据缓冲区溢出漏洞的位置信息可以得到缓冲区溢出漏洞修复的位置,根据缓冲区溢出漏洞代码所使用的API,以及缓冲区溢出模型可以得到相应的缓冲区溢出漏洞修复的策略;定位到缓冲区溢出漏洞代码的位置,提取出函数调用的参数信息;根据提取出的函数调用的参数信息和使用的API,构造出修复代码插桩到源代码中完成修复。本发明提出的缓冲区溢出自动修复方法所包含的步骤为:步骤1,读取缓冲区溢出漏洞报告文件;步骤2,从缓冲区溢出漏洞报告文件中解析出包含缓冲区溢出漏洞的源文件名、溢出漏洞代码所在行号、溢出漏洞代码所使用的API;步骤3,对同一待修复源文件的漏洞行号进行由大到小排序:在修复溢出漏洞时是通过在漏洞代码行前插入越界检查代码(简称插桩),首先对于每一个源文件按缓冲区溢出漏洞代码所在的行号由大到小整理同一个源文件的缓冲区溢出漏洞位置,对于每个待修复源文件,每次都从该文件中缓冲区溢出漏洞代码所在的行号最大的位置开始,由后向前倒序插桩,用以防止插桩后溢出位置的行号改变而影响插桩;并且对同一个源文件执行一次读写操作就可以完成插桩,效率相对较高;步骤4,读取待修复源代码文件;步骤5,获取最后一个溢出漏洞代码,由函数名确定使用的修复方法,然后实行缓冲区溢出漏洞自动修复:步骤5-1,分割字符串,提取函数名和函数调用的参数信息,并判断提取到的函数名是否与报告的函数名相同,不相同则退出并报错;步骤5-2,如果修复方法为添加越界检查:在该行前面根据函数名和函数调用的参数信息以及该API溢出条件插入越界检查代码。步骤5-3,如果修复方法为替换API:替换该行为更安全的函数调用。步骤5-4,如果修复方法为扩大缓冲区大小:从静态分析结果文件中获取到变量定义点,修改变量定义,为变量分配更大的内存空间步骤5-5,按上述步骤处理该文件所有包含溢出漏洞的代码。步骤6,跳转至步骤4,直到所有待修复源代码文件都被修复。本发明所述的方法具有如下的有益效果:(1)本发明所述的缓冲区溢出漏洞自动修复方法,提出了一个缓冲区溢出模型,通过分析C/C++语言中的API和数组引用,得到每个API和数组引用发生缓冲区溢出的条件,构成了一个缓冲区溢出模型,提供了精确的缓冲区溢出条件。(2)本发明所述的缓冲区溢出漏洞自动修复方法,对同一待修复源文件的漏洞行号进行排序时由大到小排序,使用倒序插桩,用以防止插桩后溢出位置的行号改变而影响插桩;并且对同一个源文件执行一次读写操作就可以完成插桩,效率相对较高。(3)本发明所述的缓冲区溢出漏洞自动修复方法,提供了可选的缓冲区溢出漏洞自动修复方法,可以根据需求选择所需的缓冲区溢出漏洞自动修复方法,比如在缓冲区溢出代码位置前一行添加越界检查代码、替换缓冲区溢出漏洞代码位置使用的API为更安全的API、修改变量定义来扩大缓冲区大小,提高了缓冲区溢出漏洞自动修复的灵活性。(4)本发明所述的缓冲区溢出漏洞自动修复方法,通过自动解析已确认的缓冲区溢出漏洞信息,自动生成缓冲区溢出漏洞修复代码,自动完成缓冲区溢出漏洞修复代码插桩,完成缓冲区溢出漏洞自动修复。在已知软件中已经确认过的漏洞,通过一条或若干条指令,就能一次性地自动修复这些已知的漏洞,代替了人工修复的工作,提高了缓冲区溢出漏洞修复效率,降低了缓冲区溢出漏洞修复成本。附图说明图1是本发明实施例的缓冲区溢出漏洞自动修复方法流程图。具体实施方式以下结合图1和具体实施例对本发明作进一步详细说明。根据图1所示的修复方法流程图:一.建立缓冲区溢出模型本实施例参照C99C语言标准规范,对于容易出现缓冲区溢出漏洞的API,根据其功能特点,确定这些API发生缓冲区溢出的条件,形成表1所示的缓冲区溢出模型。表1二.提出缓冲区溢出漏洞修复方法通过参考缓冲区溢出模型,提出下表2的缓冲区溢出漏洞的修复方法。表2三.读取与解析命令行参数,确定修复方法通过命令行参数来决定具体的修复方法,-m/--mode的值可为default、API-REP、extend。default(或者不写-mdefault)为添加越界检查,API-REP为API替换,extend为扩大数组。四.读取与解析缓冲区溢出漏洞报告文件读取包含项目中已知的缓冲区溢出漏洞的详细信息的报告文件,报告文件可以是通过人工确认的缓冲区溢出漏洞,也可以是某个检测工具检测出的缓冲区溢出漏洞。报告文件中包含以下内容:1.缓冲区溢出漏洞代码所在的文件名。2.缓冲区溢出漏洞代码所在的行号(文件的第几行)。3.缓冲区溢出漏洞代码所包含的函数名。从缓冲区溢出漏洞报告文件中解析出包含缓冲区溢出漏洞的源文件名、溢出漏洞代码所在行号、溢出漏洞代码所使用的API。对同一待修复源文件的漏洞行号进行由大到小排序:在修复溢出漏洞时在漏洞代码行前面插入几行越界检查的代码(简称插桩),首先对于每一个源文件按缓冲区溢出漏洞代码所在的行号由大到小整理同一个源文件的缓冲区溢出漏洞位置,对于每个待修复源文件,每次都从该文件中缓冲区溢出漏洞代码所在的行号最大的位置开始,由后向前倒序插桩,以防止插桩后因溢出漏洞位置行号的改变而影响插桩;并且对同一个源文件执行一次读写操作就可以完成插桩,效率相对较高。五.缓冲区溢出漏洞自动修复过程修复输入:待修复源码、缓冲区溢出漏洞报告文件修复过程:1)读取待修复源代码文件;2)根据待修复源文件漏洞行号由大到小获取待修复行号line、函数名;3)由函数名确定使用的修复方法;4)获取第line行代码,然后实行缓冲区溢出漏洞自动修复:a)分割字符串,提取函数名和函数调用的参数,并判断提取到的函数名是否与报告的函数名相同,不相同则退出并报错;b)通过命令行参数来决定具体的修复方法,-m/--mode的值可为default、API-REP、extend。default(或者不写-mdefault)为添加越界检查,API-REP为API替换,extend为扩大缓冲区大小。i.方法一:添加越界检查此修复方法是根据缓冲区溢出模型中每个API的溢出条件来添加越界检查。添加位置:在API调用的前一行;添加内容:if语句,判定条件为溢出条件,溢出条件中的strlen()使用c语言函数strlen()获取字符串长度(strlen获得的字符串长度是通过寻找结束符后计算得到),sizeof()使用c语言函数sizeof()获取缓冲区大小。特别的,sprintf()需要计算格式化字符串的长度进行越界检查,将MY_vsnprintf.h和MY_vsnprintf.c拷贝到修复源代码目录中,然后在代码中包含头文件#include\MY_vsnprintf.h\,这样通过调用MY_vsnprintf.c的函数intMY_vsnprintf(char*format,...)来计算格式化字符串的长度。MY_vsnprintf()函数实际上是使用vsnprintf实现的。结果:若越界条件满足,报错,return。举例:比如strcpy(dest,src)添加越界检查为:ii.方法二:API替换若-m/--mode值为API-REP,则strcpy(a,b)替换为strncpy(a,b,sizeof(a));strcat(a,b)替换为snprintf(a+strlen(a),sizeof(a)-strlen(a),\%s\,b);(备注:在a为初始化时可能会存在问题)sprintf(char*str,constchar*format,...)替换为snprintf(str,sizeof(str),format,...);而其他API使用默认的越界检查进行修复。iii.方法三:扩大缓冲区大小若-m/--mode值为extend,则从静态分析结果文件中获取到变量定义点,修改变量定义,为变量分配更大的内存空间。修复输出:修复后的源码。5)判断该待修复文件是否处理完?若未处理完,进入步骤2)步骤进行下一个溢出漏洞的修复过程。否则进入步骤6)。6)将修复后的源码文件写回。7)判断所有文件是否均被修复?若未修复完,进入步骤1)。否则,结束流程。本发明的方法效率高、灵活性好,代替了人工修复的工作,提高了缓冲区溢出漏洞修复效率,降低了缓冲区溢出漏洞修复成本。本发明已以较佳实施例公开如上,但它们并不是用来限定本发明,任何熟习此技艺者,在不脱离本发明之精神和范围内,自当可作各种变化或润饰,因此本发明的保护范围应当以本申请的权利要求保护范围所界定的为准。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1