CN105809039A - 缓冲区溢出漏洞自动修复方法 - Google Patents
缓冲区溢出漏洞自动修复方法 Download PDFInfo
- Publication number
- CN105809039A CN105809039A CN201610122116.1A CN201610122116A CN105809039A CN 105809039 A CN105809039 A CN 105809039A CN 201610122116 A CN201610122116 A CN 201610122116A CN 105809039 A CN105809039 A CN 105809039A
- Authority
- CN
- China
- Prior art keywords
- buffer
- overflow
- overflow vulnerability
- code
- vulnerability
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
Abstract
本发明是一种缓冲区溢出漏洞自动修复方法,基于缓冲区溢出模型,自动修复程序中已知的缓冲区溢出漏洞。首先读取并解析已经通过确认过的缓冲区溢出信息文件,该文件包含缓冲区溢出漏洞的源文件名、溢出漏洞代码所在的行号、溢出漏洞代码所使用的API,根据缓冲区溢出漏洞的位置信息得到缓冲区溢出漏洞修复的位置,根据缓冲区溢出漏洞代码所使用的API,以及缓冲区溢出模型得到相应的缓冲区溢出漏洞修复策略;定位到缓冲区溢出漏洞代码的位置,提取函数调用的参数信息;根据提取出的函数调用的参数信息和使用的API,构造出修复代码插桩到源代码中完成修复。
Description
技术领域
本发明属于软件工程领域,尤其涉及一种缓冲区溢出漏洞自动修复方法。
背景技术
缓冲区是指一个程序在运行期间在内存中分配的一个连续的存储空间,该存储空间用于存放各种类型的数据。缓冲区溢出是指如果用户输入的数据长度超出了程序为其分配的内存空间,这些数据就会覆盖程序为其它数据分配的内存空间,造成缓冲区溢出。缓冲区溢出漏洞是最常见的软件安全漏洞之一,对软件中存在的缓冲区溢出漏洞进行修复是保证软件安全的重要手段。软件漏洞自动修复属于软件维护的范畴。
目前缓冲区溢出漏洞的修复在很大程度上需要人工的参与,会耗费较多人力,延长软件维护耗费的时间,增加软件维护成本。
发明内容
针对现有技术中存在的问题,本发明提出一种缓冲区溢出漏洞自动修复方法,通过建立缓冲区溢出模型并具此提出相应的修复方法,来自动修复程序中已知的缓冲区溢出漏洞。
为了实现上述发明目的,其采用的技术方案为:首先读取并解析已经通过人工确认或者通过缓冲区溢出检测工具确认过的缓冲区溢出漏洞报告文件,该文件包含缓冲区溢出漏洞的源文件名、溢出漏洞代码所在的行号、溢出漏洞代码所使用的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)。否则,结束流程。
本发明的方法效率高、灵活性好,代替了人工修复的工作,提高了缓冲区溢出漏洞修复效率,降低了缓冲区溢出漏洞修复成本。
本发明已以较佳实施例公开如上,但它们并不是用来限定本发明,任何熟习此技艺者,在不脱离本发明之精神和范围内,自当可作各种变化或润饰,因此本发明的保护范围应当以本申请的权利要求保护范围所界定的为准。
Claims (6)
1.缓冲区溢出漏洞自动修复方法,其特征在于,包括以下步骤:
步骤1,读取缓冲区溢出漏洞报告文件;
步骤2,从缓冲区溢出漏洞报告文件中解析出缓冲区溢出漏洞的源文件名、溢出漏洞代码所在行号、溢出漏洞代码所使用的API;
步骤3,对同一待修复源文件的漏洞行号进行排序;
步骤4,读取待修复源代码文件;
步骤5,获取最后一个溢出漏洞代码,根据函数名,在缓冲区溢出模型中确定使用的修复方法,实行缓冲区溢出漏洞修复,输出修复后的源码;
步骤6,跳转至步骤4,直到所有待修复源代码文件都被修复。
2.根据权利要求1所述的自动修复方法,其特征在于:缓冲区溢出漏洞报告文件是通过人工确认的缓冲区溢出漏洞,或检测工具检测出的缓冲区溢出漏洞;报告文件中包含以下内容:
(1)缓冲区溢出漏洞代码所在的文件名;
(2)缓冲区溢出漏洞代码所在的行号;
(3)缓冲区溢出漏洞代码所包含的函数名。
3.根据权利要求1所述的自动修复方法,其特征在于,步骤3中排序方法为:按缓冲区溢出漏洞代码所在的行号由大到小整理同一个源文件的缓冲区溢出漏洞位置。
4.根据权利要求1所述的自动修复方法,其特征在于,所述插桩方法为:对于每个待修复源文件,每次都从该文件中缓冲区溢出漏洞代码所在的行号最大的位置开始,由后向前倒序插桩。
5.根据权利要求1所述的自动修复方法,其特征在于,步骤5中包含以下步骤:
步骤5-1,分割字符串,提取函数名和函数调用的参数信息,并判断提取到的函数名是否与报告的函数名相同,不相同则退出并报错;
步骤5-2,通过命令行参数来决定具体的修复方法:如果修复方法为添加越界检查:在溢出漏洞代码所在行前面根据函数名和函数调用的参数信息以及该API溢出条件插入越界检查代码;如果修复方法为替换API:替换为更安全的函数调用;如果修复方法为扩大缓冲区大小:从静态分析结果文件中获取到变量定义点,修改变量定义,为变量分配更大的内存空间;
步骤5-3,按上述步骤处理该文件所有包含溢出漏洞的代码。
6.根据权利要求1所述的自动修复方法,其特征在于:根据缓冲区溢出模型中定义溢出类型和溢出条件,明确提出了相应的自动修复方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610122116.1A CN105809039B (zh) | 2016-03-04 | 2016-03-04 | 缓冲区溢出漏洞自动修复方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610122116.1A CN105809039B (zh) | 2016-03-04 | 2016-03-04 | 缓冲区溢出漏洞自动修复方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105809039A true CN105809039A (zh) | 2016-07-27 |
CN105809039B CN105809039B (zh) | 2018-07-27 |
Family
ID=56466648
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610122116.1A Active CN105809039B (zh) | 2016-03-04 | 2016-03-04 | 缓冲区溢出漏洞自动修复方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105809039B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107895115A (zh) * | 2017-12-04 | 2018-04-10 | 北京元心科技有限公司 | 防止栈溢出的方法、装置及终端设备 |
CN110147673A (zh) * | 2019-03-29 | 2019-08-20 | 中国科学院信息工程研究所 | 一种基于文本和源代码符号提取的漏洞位置标注方法和装置 |
CN110471662A (zh) * | 2019-08-21 | 2019-11-19 | 北京百度网讯科技有限公司 | 程序转换方法、装置及设备 |
CN113254347A (zh) * | 2021-06-21 | 2021-08-13 | 南京统信软件技术有限公司 | 一种日志函数添加方法、计算设备及储存介质 |
CN114969765A (zh) * | 2022-07-27 | 2022-08-30 | 杭州海康威视数字技术股份有限公司 | 一种物联网设备无感安全漏洞修复方法、装置及设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1708071A1 (en) * | 2005-03-31 | 2006-10-04 | Texas Instruments Incorporated | Method and system for detection and neutralization of buffer overflow attacks |
CN102214142A (zh) * | 2011-07-15 | 2011-10-12 | 南京大学 | 无痕可管理的源代码手动定义标志插桩方法 |
CN103713998A (zh) * | 2013-11-07 | 2014-04-09 | 北京安码科技有限公司 | 一种可扩展的在线静态代码缺陷分析方法 |
CN104915595A (zh) * | 2015-06-30 | 2015-09-16 | 北京奇虎科技有限公司 | 云平台虚拟化漏洞修复的方法及装置 |
US9251373B2 (en) * | 2013-03-13 | 2016-02-02 | Northern Borders University | Preventing stack buffer overflow attacks |
-
2016
- 2016-03-04 CN CN201610122116.1A patent/CN105809039B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1708071A1 (en) * | 2005-03-31 | 2006-10-04 | Texas Instruments Incorporated | Method and system for detection and neutralization of buffer overflow attacks |
CN102214142A (zh) * | 2011-07-15 | 2011-10-12 | 南京大学 | 无痕可管理的源代码手动定义标志插桩方法 |
US9251373B2 (en) * | 2013-03-13 | 2016-02-02 | Northern Borders University | Preventing stack buffer overflow attacks |
CN103713998A (zh) * | 2013-11-07 | 2014-04-09 | 北京安码科技有限公司 | 一种可扩展的在线静态代码缺陷分析方法 |
CN104915595A (zh) * | 2015-06-30 | 2015-09-16 | 北京奇虎科技有限公司 | 云平台虚拟化漏洞修复的方法及装置 |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107895115A (zh) * | 2017-12-04 | 2018-04-10 | 北京元心科技有限公司 | 防止栈溢出的方法、装置及终端设备 |
CN107895115B (zh) * | 2017-12-04 | 2021-01-29 | 北京元心科技有限公司 | 防止栈溢出的方法、装置及终端设备 |
CN110147673A (zh) * | 2019-03-29 | 2019-08-20 | 中国科学院信息工程研究所 | 一种基于文本和源代码符号提取的漏洞位置标注方法和装置 |
CN110471662A (zh) * | 2019-08-21 | 2019-11-19 | 北京百度网讯科技有限公司 | 程序转换方法、装置及设备 |
CN113254347A (zh) * | 2021-06-21 | 2021-08-13 | 南京统信软件技术有限公司 | 一种日志函数添加方法、计算设备及储存介质 |
CN114969765A (zh) * | 2022-07-27 | 2022-08-30 | 杭州海康威视数字技术股份有限公司 | 一种物联网设备无感安全漏洞修复方法、装置及设备 |
CN114969765B (zh) * | 2022-07-27 | 2022-11-01 | 杭州海康威视数字技术股份有限公司 | 一种物联网设备无感安全漏洞修复方法、装置及设备 |
Also Published As
Publication number | Publication date |
---|---|
CN105809039B (zh) | 2018-07-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105809039A (zh) | 缓冲区溢出漏洞自动修复方法 | |
CN106446691A (zh) | 检测软件中集成或定制的开源项目漏洞的方法和装置 | |
CN102708053B (zh) | 程序路径中确定函数调用的上下文环境影响的方法 | |
CN107341102B (zh) | 一种测试用例文件生成方法及装置 | |
ATE466334T1 (de) | Programmieren eines flash-speichers | |
CN114708133B (zh) | 一种通用的文本水印方法和装置 | |
CN109934227A (zh) | 图像文字识别系统和方法 | |
ATE408864T1 (de) | Verfahren zum kopieren von daten innerhalb eines wiederprogrammierbaren nichtflüchtigen speichers | |
CN101876970A (zh) | 一种合并报表方法和装置 | |
CN106598564A (zh) | 一种自适应不同主板的bios实现方法、bios及主板 | |
CN106598827A (zh) | 提取日志数据的方法及装置 | |
CN103955354B (zh) | 重定位方法和装置 | |
CN110222617A (zh) | 一种pdf文件修复方法和系统 | |
CN110362542A (zh) | 核电站文件编码方法、装置、计算机设备和存储介质 | |
CN107203500A (zh) | 基于递归替换展开回溯的excel公式面向对象语言的自动转换方法 | |
CN111142877B (zh) | Rom芯片补丁的接口函数及参数类型自动化提取方法、系统及存储介质 | |
CN109408114B (zh) | 一种程序错误自动修正方法、装置、电子设备及存储介质 | |
CN101272222A (zh) | 一种约束校验方法及装置 | |
CN113283213B (zh) | 一种基于机器学习的电路设计系统及方法 | |
CN115116069A (zh) | 文本处理方法、装置、电子设备及存储介质 | |
CN115640155A (zh) | 基于语句依赖和补丁相似性的程序自动修复方法与系统 | |
US11366742B2 (en) | Automated identification of lines of code related to errors field | |
CN107133178A (zh) | 一种不同格式测试用例自动导入方法 | |
CN113282495A (zh) | 一种基于轨迹监控的Java软件故障定位方法 | |
CN108694016B (zh) | 模拟eeprom数据分析系统及方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |