论文部分内容阅读
随着网络和通信设备的迅速发展,从PC到控制关键基础设施的系统都加入互联网,单个软件系统的错误可能影响多个系统,且便于攻击者利用软件漏洞进行攻击,攻击者无需占领物理的信息系统就能实施远程攻击,使得脆弱软件的安全性风险比以往更大。另外为实现更多功能,软件的复杂度日益增加,在软件开发过程中,随着模块本身增大和模块数的增加,缺陷出现的概率也随之增大,通过检查和维护查找缺陷的难度也增加。系统的可扩展性一方面便于系统扩充升级,系统功能可处在不断增长中,另一方面更利于恶意代码的插入。如许多程序能通过脚本、控件和动态装载库等进行扩充,这也使得相应形式的恶意代码更容易引入,且难以检测。
在这种背景下,抵御篡改程序控制流的方法引起广泛的关注。我们认为一个成功的控制流完整性保护方案应该兼顾准确性、效率两方面的要求。准确性体现在监控系统能够正确的报告入侵,误报率低;效率体现为监控系统的加入不能够给被监控系统带来过高的性能负担。
在对已有的控制流完整性保护方案研究的基础上,我们提出了一个新的基于代码签名的控制流监控方法-CFIMS(Control-Flow Integrity Monitor System)。CFIMS在前期通过对源代码、目标代码的静态分析,以跳转指令为监控点建立表达程序原意的控制流程图(CFG,Control-Flow Graph)。模型中记录了每次跳转的源地址、目标地址、目标地址处代码等信息。
在运行期,利用了硬件的支持,使得被监控程序在跳转点自动发生陷入,由监控程序比对CFG中保存的地址等信息,确认程序是否正常运行。如果与CFG中保存的信息不匹配,可以认为程序发生了异常,暂停被监控程序的执行发出警报。
相比以前的工作,CFIMS选择监视了程序的每次跳转,而不是仅仅在系统调用处,这样的监控粒度更细,避免了一些情况下的漏报。另外,使用系统调用为监控点时常存在的参数问题不再存在。
CFIMS利用了静态检测的方法,包括源代码分析和目标代码分析,建立的模型更加贴近程序原意,而且无须重复正常执行程序的时间开销。另外由于使用了Intel处理器的对分叉指令调试的支持,使得被监控程序在执行期能够自动发生陷入,比二进制改写的方法更加准确。