论文部分内容阅读
内存错误漏洞引起的安全问题,一直以来都困扰着工业界的开发者和学术界的研究者。在现实生活中,它不仅仅对软件有极大地危害,甚至进一步的会对社会产生安全问题,造成重大的经济损失以及个人隐私的泄漏。虽然近几十年来,在内存漏洞上的防护已经做了很多的研究,提出了很多保护的机制,很多好的保护机制也已经使用起来,但是每年发现的新的漏洞仍然没有显著减少;而该类漏洞所造成的损失(不仅仅是经济损失)却随着互联网经济的蓬勃发展越来越大。内存错误漏洞整个课题过于庞大,一篇论文无法述说清楚。本文也不准备对所有的内存错误漏洞进行保护,仅仅针对内存漏洞中的对非控制数据攻击这一方而进行论述。本文根据攻击日标的区分分为对控制数据的攻击,比如函数指针,返回地址等,对这类数据的篡改能很直观的看到控制流的改变;和对非控制数据进行的攻击,对这些数据的攻击并非像想想中那么无关紧要。这类数据的攻击同样可以达到篡改控制数据同样的效果,改变程序的控制流,获得更高的权限等。对于控制流的数据保护已经有相当多的文章提出有效的方案,比如StackGuard就是对调用栈上的返回地址等信息的保护。但是对非控制数据保护的重视一直以来都未提高到与其危害相对应的该有的高度上来。本文所研究的重点就是对非控制数据攻击的防护。本文提出的保护机制的基本思想是对内存中的数据进行随机化。通过对程序的修改,插装新的指令,使得保存到内存上的数据随机化。这种方式就能有效的阻止非控制数据的破坏,甚至起到一定效果的内存数据隐私保护。本文基于开源的LLVM编译器系统平台,实现了一个编译优化Pass模块,在能获取源文件时经过该Pass模块优化后生成的可执行程序能够免受非控制数据攻击的危害。加入开源的QEMU-LLVM项目所实现x86指令转LLVM指令的功能,在无法提供源文件时也能动态的转译可执行文件成Pass所能处理的LLVM指令,添加对非控制数据的保护。进一步的扩大了保护软件的范围。