基于动态插桩的大块内存分配系统及方法与流程

文档序号:11216201
基于动态插桩的大块内存分配系统及方法与流程

本发明涉及的是一种计算机领域的技术,具体是一种基于动态插桩的针对大于4KB内存块的分配系统及方法。



背景技术:

随着Linux操作系统在个人计算机、服务器、移动终端等领域的广泛普及,其安全性随之成为了一个所有人无法回避的话题。操作系统的安全性直接影响了运行于操作系统之上的应用程序的安全性,并对所有用户的隐私与利益构成威胁。为了增强Linux系统的安全性,多种安全增强技术被设计并应用到现实的生产环境中,其中就包含内存地址随机化技术,该技术能够有效的阻止攻击者通过应用程序漏洞对应用程序实施内存攻击。

内存随机化的程度是用于衡量一个内存地址随机化技术安全性的最重要的指标。在实际使用时,当内存分配请求过大时,所有的内存分配技术都会直接使用操作系统的mmap以及brk系统调用来进行内存分配。而在Linux操作系统中,这两个系统调用返回的内存不是完全随机的:连续的系统调用,返回的地址也是连续的。该特性导致了即使对于安全内存随机化分配技术来说,大内存块的分配随机性仍然存在缺陷,可以被攻击者利用。

尽管国内外的研究中有很多针对这类系统调用随机化措施,但是在可移植性,以及brk 系统调用的防御上始终存在一些缺陷。



技术实现要素:

本发明针对现有技术只能支持线下分析的缺陷检测功能,一来缺少对检测到缺陷的防护功能,二来对一些实时性要求较高的软件,其性能上的开销也无法达到实际生产中线上检测/ 防护的要求,提出一种基于动态插桩的大块内存分配系统及方法,通过自动化定位相似的代码,从而将已经分析完成的代码信息同步迁移到不同的平台上,着重于对实际系统中存在的通用性系统缺陷进行防护,更为注重对实时系统的防御以及性能开销。

本发明是通过以下技术发明实现的:

本发明涉及一种基于动态插桩的大块内存分配系统,包括:内存布局获取模块、调用拦截模块、内存随机化分配模块和污点跟踪模块,其中:内存布局获取模块与内存随机化分配模块相连并传输空闲内存块信息,调用拦截模块与内存随机化分配模块以及污点跟踪模块相连并传输上层应用程序系统调用信息,内存随机化分配模块连接用户进程并传输随机化后的内存地址信息,污点跟踪模块与内存随机化分配模块相连并传输对brk内存区域污点跟踪信息。

本发明涉及上述系统的大块内存分配方法,首先获得程序内存布局信息,然后通过动态插桩工具拦截mmap和brk系统调用,即首先对二进制程序的基本块进行指令翻译;然后对翻译过后的基本块检查是否有系统调用指令;最后对检测到的系统调用指令进行插桩,并对mmap 系统调用进行随机化分配、对brk系统调用使用污点跟踪处理,从而实现大块内存分配。

所述的随机化分配是指:

i)当上层应用请求的内存大小超过4KB时,从现有内存中满足大小的最小的空闲内存块开始,并随机选取一个空闲内存块,从中随机选取一个偏移值进行内存分配;

ii)当请求内存不超过4KB,即一个内存页时,从另一块单页空闲内存池中随机进行分配;

iii)单页空闲内存池在内存分配开始时进行初始化,为满足随机化要求,单页空闲内存池中应保证一定数量的内存页供随机化选择。

所述的污点跟踪处理是指:对brk系统调用使用污点跟踪技术,并对内存块进行实时迁移,具体包括:

①当第一次检测到brk系统调用时开始污点跟踪,对每条内存读写指令进行污点跟踪,判断是否存在brk内存区域的指针引用;

②当应用请求的brk内存超过阈值1时,对brk内存区域进行随机化的迁移,并根据污点跟踪信息更新指针引用;

③当应用请求的brk内存超过阈值2时,返回错误信息,表示brk内存分配失败。

技术效果

与现有技术相比,本发明使用动态插桩技术对大块内存进行实时随机化的分配发明。相较于以往的其他发明,本发明可迁移性更好,并且可以对brk分配的内存块进行随机化的防护;此外,本发明在Nginx下测试性能开销在5%到10%之间,能成功防御堆风水和堆喷射两种攻击技术,能够稳定运行包括Nginx在内的多种类别的应用程序。

附图说明

图1为本发明系统结构示意图。

具体实施方式

如图1所示,本实施例包括:内存布局获取模块、调用拦截模块、内存随机化分配模块和污点跟踪模块,其中:内存布局获取模块与内存随机化分配模块相连并传输空闲内存块信息;调用拦截模块与内存随机化分配模块以及污点跟踪模块相连并传输上层应用程序系统调用信息;内存随机化分配模块连接用户进程并传输随机化后的内存地址信息;污点跟踪模块与内存随机化分配模块相连并传输对brk内存区域污点跟踪信息。

本实施例涉及上述系统的大块内存分配方法,包括以下步骤:

1)使用动态插桩框架,在应用程序运行前使用程序加载器(loader)加载程序文件。

所述的程序加载器具体是指:操作系统运行一个程序时会从内核中调用一个指定程序加载器对即将运行的应用程序进行一些初始化的操作。动态插桩框架通过在第一步加载阶段进行拦截,并对二进制文件进行指令翻译。

2)通过解析/proc/self/maps文件获取程序内存布局,具体包括:

2.1)读取并解析/proc/self/maps文件内容

2.2)分析内存中的空闲内存块,并保存在全局数组中,供后续随机化模块使用

3)拦截程序运行中所有的mmap/munmap/mremap系统调用,并进行随机化处理,具体包括:

3.1)通过动态插桩框架在系统调用指令处插桩,拦截mmap/munmap/mremap系统调用

3.2)当上层应用请求的内存大小超过4KB,则从现有内存中满足大小的最小的空闲内存块开始,并随机选取一个空闲内存块,从中随机选取一个偏移值进行内存分配

3.3)当请求内存不超过4KB(一个内存页),则从另一块单页空闲内存池中随机进行分配

3.4)单页空闲内存池在内存分配开始时进行初始化,为满足随机化要求,单页空闲内存池中应保证一定数量的内存页供随机化选择。

4)在执行步骤3)的同时,拦截程序运行中所有的brk系统调用,具体包括:

4.1)当第一次检测到brk系统调用时开始污点跟踪,对每条内存读写指令进行污点跟踪,判断是否存在brk内存区域的指针引用

4.2)当应用请求的brk内存超过200MB时,返回错误信息,表示brk内存分配失败。

5)使用污点跟踪技术记录所有指向brk内存的指针。当brk分配的内存超过512KB时,对该内存块随机迁移到一个新的地址,并修复指针,具体包括:

5.1)使用随机化分配模块寻找合适的内存地址;

5.2)将当前的brk段数据的引用指针修改成新的内存地址;

5.3)最后把brk段数据拷贝到新的内存地址。

上述具体实施可由本领域技术人员在不背离本发明原理和宗旨的前提下以不同的方式对其进行局部调整,本发明的保护范围以权利要求书为准且不由上述具体实施所限,在其范围内的各个实现发明均受本发明之约束。

再多了解一些
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1