一种基于指针解引用插桩的C/C++释放后重引用动态检测方法
- 国知局
- 2024-12-06 12:08:54
本发明属于网络安全领域,尤其涉及一种基于指针解引用插桩的c/c++释放后重引用动态检测方法。
背景技术:
1、2011年,google的工程师首次提出了address sanitizer(以下简称asan),用以快速地进行内存错误检测,其工作原理是在编译时插入额外的代码段来跟踪内存的分配和访问,从而检测出多种内存错误。与此前的工具相比,asan具有运行效率高、检测范围广、使用方便等特点。在错误检测方面,asan可以精确定位异常的位置,并给出详细的错误报告。历经十余年的发展,asan的功能不断增强,现已成为常用的内存调试与代码缺陷检测工具。
2、然而,asan在设计上并非完备,对于以下情况可能出现漏报:缓冲区非连续越界访问,即跨越了redzone访问另一个缓冲区;同一个地址被重复申请,导致uaf指针指向的区域是合法地址,此时无法检测到错误。同时,业界已有的改进fuzzan虽然实现了上述漏报的检测,却带来了o(log n)的访问开销。
3、因此,设计并实现一种内存检测机制,在保留asan高效性(o(1)的访问开销)的基础上解决其漏检测的两种问题,可以提高软件测试发现漏洞的能力,对安全研究具有重要意义。
技术实现思路
1、本发明的目的在于针对现有技术的不足,提供了一种基于指针解引用插桩的c/c++释放后重引用动态检测方法。
2、本发明的目的是通过以下技术方案来实现的:一种基于指针解引用插桩的c/c++释放后重引用动态检测方法,包括以下步骤:
3、(1)在编译阶段收集所有内存分配与释放、指针解引用指令信息,将所有内存分配的调用点记为集合cm,将所有内存释放的调用点记为集合cf,将所有指针解引用的指令点记为集合cd;
4、(2)在编译阶段对上一步收集的集合cm、集合cf和集合cd的参数与返回值进行指针分析,所述指针分析包括依赖分析和值传递链分析,提取得到集合cf和集合cd的参数的依赖集vd和vf,并提取得到集合cm的内存分配返回值的传递集vm;
5、(3)在中间代码阶段对集合cm、集合cf和集合cd进行插桩,验证并更新与其对应的vf和vm地址所映射的影子内存的可用状态,并在函数返回时解除临时变量的不可用状态。
6、进一步地,步骤(2)中,所述提取得到集合cf和集合cd的参数的依赖集vd和vf,具体包括以下子步骤:
7、(a.1)在llvm框架下提取集合cf中每一个调用点的参数,得到参数集合其中,表示集合cf中任意一个调用点的参数,i=1,…,i,…,n,n表示参数集合中总共有n个参数;并在llvm框架下提取集合cd中每一个指令点的参数,得到参数集合其中,表示集合cd中任意一个指令点的参数,j=1,…,j,…,m,m表示参数集合中总共有m个参数;
8、(a.2)针对参数集合中任意一个参数的类型进行检查:
9、a)若参数的类型为loadinst类型,则更新参数:对参数调用loadinst.pointeroperand方法得到返回值作为更新后的参数并重复步骤(a.2)检查更新后的参数的类型;
10、b)若参数的类型为storeinst类型,则更新参数:对参数调用storeinst.valueoperand方法得到返回值作为更新后的参数并重复步骤(a.2)检查更新后的参数的类型;
11、c)若参数的类型为getelementptr类型,则更新参数:对参数对应的指令调用pointeroperand方法得到返回值为更新后的参数并重复步骤(a.2)检查更新后的参数的类型;
12、d)若参数的类型为allocainst类型:若参数对应的指令具有唯一storeinst引用,则更新参数:对唯一引用参数的storeinst指令调用valueoperand方法得到返回值作为更新后的参数并重复步骤(a.2)检查更新后的参数的类型;反之则将参数作为调用点对应的依赖地址加入到集合vf,结束检查;
13、e)若参数的类型为globalvariable类型或argument类型则将参数作为调用点对应的依赖地址加入到集合vf,结束检查;
14、(a.3)针对参数集合中每一个参数重复步骤(a.2),得到集合cf的依赖集vf:
15、(a.4)针对参数集合中每一个参数重复步骤(a.2),得到集合cd的依赖集vd:
16、进一步地,步骤(2)中,所述提取得到集合cm的参数的传递集vm,具体包括以下子步骤:
17、(b.1)在llvm框架下提取集合cm中每一个调用点的参数,得到参数集合其中,表示集合cm中任意一个调用点的参数,k=1,…,k,…,l,l表示参数集合中总共有l个参数;
18、(b.2)针对参数集合中每一个参数获取参数的所有引用指令作为集合其中,表示集合中任意一个引用指令,g=1,…,g,…,em,em表示集合中总共有em个引用指令;
19、(b.3)针对集合中每一个引用指令进行引用检查:若引用指令的指令类型不为loadinst或storeinst类型则跳过该引用指令对下一个引用指令进行检查;若引用指令的指令类型为loadinst或storeinst类型,则对引用指令调用pointeroperand方法得到返回值并添加到传递地址集合随后再对返回值再进行引用检查,直到返回值的指令类型不为loadinst或storeinst类型;
20、完成对集合中每一个引用指令进行引用检查后,得到传递地址集合
21、(b.4)针对参数集合中每一个参数重复步骤(b.3),得到集合cm的传递集vm:
22、进一步地,步骤(3)中,对集合cm、集合cf和集合cd进行插桩,具体包括以下子步骤:
23、(c.1)针对集合cf中每一个调用点均插入额外的状态维护指令__sanitizer_check_free,传入与调用点对应的依赖地址作为参数,得到集合c′f;
24、(c.2)针对集合cm中每一个调用点均插入额外的状态维护指令__sanitizer_check_malloc,传入与调用点对应的传递地址集合作为参数,得到集合c′m;
25、(c.3)针对集合cd中每一个指令点均插入额外的状态维护指令__sanitizer_check_deref,传入与指令点对应的依赖地址作为参数,得到集合cd′;
26、(c.4)针对集合c′f,在集合c′f中每个终结块的returninst指令前插入额外的指令__sanitizer_unposion。
27、进一步地,插入额外的状态维护指令__sanitizer_check_free、__sanitizer_check_malloc和__sanitizer_check_deref需要维护以下原则:
28、(d.1)所有malloc调用的指针所在地址影子内存置为unpoison状态;
29、(d.2)所有free调用的依赖树根结点所在地址影子内存置为poison状态;
30、(d.3)所有局部变量在其上下文销毁前将其地址影子内存置为unpoison状态。
31、进一步地,步骤(c.3)中,插入状态维护指令__sanitizer_check_deref需要检验传入参数对应影子内存是否为poison状态,在检测到使用poison地址时立即终止程序流程,并输出错误信息。
32、本发明的有益效果是:
33、1)本发明可以识别传统检测方法(addresssanitizer)检测不到的释放后重使用合法地址漏洞;
34、2)本发明相比已有的fuzzan方案,在扩展addresssanitizer检测功能的基础上实现了常数级的单次访存复杂度。
本文地址:https://www.jishuxx.com/zhuanli/20241204/339601.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。
下一篇
返回列表