[发明专利]一种高效且高可用的空间内存错误检测方法有效
申请号: | 201410005315.5 | 申请日: | 2014-01-06 |
公开(公告)号: | CN103745755B | 公开(公告)日: | 2017-01-11 |
发明(设计)人: | 丁丽萍;赵晓柯;卢国庆 | 申请(专利权)人: | 中国科学院软件研究所;公安部第三研究所 |
主分类号: | G11C29/56 | 分类号: | G11C29/56 |
代理公司: | 北京君尚知识产权代理事务所(普通合伙)11200 | 代理人: | 余长江 |
地址: | 100190 *** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 高效 可用 空间 内存 错误 检测 方法 | ||
技术领域
本发明属于计算机软件内存安全技术领域,具体涉及一种空间内存错误检测方法。
背景技术
程序的内存错误通常分为两类:空间内存错误和时间内存错误。空间内存错误包括数组越界错误(如,缓冲区溢出),未初始化指针解引用,无效的类型转换错误,格式化字符串错误等等。时间内存错误包括悬挂指针解引用,双重释放,无效释放等等。内存错误大多存在于C/C++语言中,因为根据C/C++语言标准,数组越界,空指针解引用,读一个未初始化的变量,会导致未定义的行为。攻击者可以通过利用程序的内存错误来控制程序的执行。在CWE/SANS发布的排名前25个最危险的软件错误中,内存错误占据4个。另外根据NIST的NVD漏洞数据库的报告,在2011年的1818个高危漏洞中,超过1/3都是由内存错误引起的。
目前,空间内存错误的检测方法可以分为两种:基于内存对象边界的检测和基于指针边界的检测。基于内存对象边界的检测通常使用一个单独的数据结构来记录和追踪程序运行时分配的内存区域的边界信息,当使用指针访问一个内存区域时,使用记录的内存对象边界信息来检测指针是否指向该内存区域。这种方法虽然能够提高程序的兼容性,能够透明的与库函数进行交互,但是该方法由于使用的数据结构比较复杂,导致程序的性能开销比较高,而且不能检测使用指针访问一个内存对象中的子内存对象的错误。基于指针边界的检测将指针指向的内存对象的边界信息与每个指针关联起来,当指针访问内存对象时,使用这些边界信息检测指针是否在内存对象内。在实现这种方法时,通常会修改指针的内存表示,将指针指向的内存对象的边界信息与该指针存储在一起。这种方法虽然避免了查找边界信息造成的性能开销,但是因为指针的内存表示被修改,所以该方法使得程序无法与库函数进行透明的交互,降低了程序的兼容性。
宾夕法尼亚大学的Santosh于09年在PLDI会议上发表论文《SoftBound:Highly Compatible and Complete Spatial Memory Safety for C》,该论文提出了一种基于指针边界的方法,通过将指针的边界信息与指针分开存储来提高程序与使用的库函数的兼容性,并可以检测指针访问子内存对象时出现的错误。但是这种方法的性能开销仍然比较高,而且,当检测到程序的内存错误时,程序就会终止运行,这样会降低程序的可用性,并且可以导致拒绝服务攻击。
发明内容
针对目前基于指针边界的空间内存错误检测方法中存在的性能开销高、兼容度低、可用性低的问题,本发明的目的在于提供一种低性能开销、高兼容度且高可用性的空间内存错误检测方法,以更好且更高效地实时检测程序运行过程中出现的内存错误,且保证在发生内存错误时,程序可以继续正常运行,防止攻击者实施拒绝服务攻击。
为实现上述目的,本发明采用如下技术方案:
一种高效且高可用的空间内存错误检测方法,包括以下步骤:
1)对程序进行静态污点分析,标记污点指针;
2)对程序进行编译生成中间代码,并构建内存影子空间;
3)分析程序的中间代码,创建该污点指针的base和bound边界信息,并存储到所述的内存影子空间;
4)对程序中间代码中的指针运算、数组索引和指针赋值三种指令进行分析,将参与运算的被标记为污点指针的原始指针的边界信息拷贝到运算后得到的结果指针对应的影子空间中;
5)对程序中使用污点指针进行写内存的指令,进行指针边界检测,根据污点指针的base和bound边界信息确定的内存边界,检测出空间内存错误。
进一步地,步骤1)中,标记污点指针又包括以下步骤:
1-1)将程序调用的外部库函数返回和修改的数据标记为污点(taint),其中“数据”包括指针类型数据和非指针类型数据;
1-2)对程序进行数据流分析,传播污点标记;
1-3)对程序进行指针别名分析,将与上述污点指针是别名关系的指针标记为taint。
进一步地,步骤1-1)中,还包括将程序所接受的用户输入的参数值标记为taint。
进一步地,步骤1-1)中所述的外部库函数包括从文件中读取数据的库函数和从网络中接收数据的库函数,所述的用户输入的参数值是指程序的命令行参数。
进一步地,步骤1-2)中所述的数据流分析是程序间的数据流分析,步骤1-3)中所述的指针别名分析是指程序间的指针别名分析。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国科学院软件研究所;公安部第三研究所,未经中国科学院软件研究所;公安部第三研究所许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201410005315.5/2.html,转载请声明来源钻瓜专利网。