论文部分内容阅读
现如今,软件的数量和代码量呈爆炸式增长,随之而产生的安全性问题也引起越来越多的关注。程序员的一个不经意的小错误可能会引发严重的后果,影响到软件运行的稳定性和用户使用的安全性。由于许多程序员缺乏一定的代码编写的安全意识,或者单纯追求功能上的满足性,所以容易产生错误的代码逻辑或者忽略对输入的合法性判断。就目前来看,格式化字符串、栈溢出和堆缓冲区漏洞仍然是主流的漏洞类型,这些类型的漏洞不仅出现率较高,还容易被利用而造成进一步攻击。这些漏洞不仅可能存在于新编写的代码中,也可能存在于陈年老代码中,而且随着软件的代码量越来越大,以及软件供应链越来越复杂,漏洞逐渐呈现出多样性和隐蔽性,人工越来越难以挖掘到有价值的漏洞。同时,在复杂的软件中,人工构造利用需要考虑实际环境所具备的各种条件,漏洞利用也要求人对计算机底层、程序运行等知识有较深的理解,因而手动构造利用脚本变得越来越困难,构造利用的速度也越来越慢。这两个因素导致软件漏洞的自动化挖掘与利用成为当前研究的热点。通过对当前的漏洞自动挖掘与利用技术进行研究,发现目前的技术存在对漏洞的分类不够明确,对漏洞的利用不够直接有效,以及缺乏对复杂类型的漏洞利用的研究等几个问题,同时对当前的技术进行对比,最后采用符号执行技术,对格式化字符串漏洞、栈溢出漏洞和堆缓冲区漏洞的行为进行建模,当发现漏洞时即可确定漏洞类型,然后根据漏洞特征和程序特征进行自动化利用或生成利用方案。本文实现了一个完整的漏洞自动挖掘、利用与防护的系统。本系统采用fuzzing和符号执行技术,根据漏洞行为模型,能够有效挖掘出格式化字符串、栈溢出和堆缓冲区漏洞,并采用符号执行技术生成相应的exp或利用方案,最后根据漏洞的类型和特征,生成相应的补丁程序。与已有研究不同的是,本系统涉及到对堆缓冲区漏洞的自动利用研究,并且在利用成功后修补漏洞,本系统还能对静态编译的程序的函数进行准确识别。本系统对20个包含漏洞的32位x86程序进行测试,总共发现16个漏洞,并生成了 10个程序的exp和利用方案,对14个程序生成了补丁,最后在实用性测试中发现21个真实软件漏洞。