CPI:一种新型代码指针完整性防御技术

版权申诉
0 下载量 20 浏览量 更新于2024-08-20 收藏 287KB PDF 举报
"Code-Pointer Integrity.pdf 是一份探讨新型防御技术的文档,主要介绍了一种名为CPI(Code-Pointer Integrity)的方法,旨在保护代码指针的完整性,以抵御包括ROP(Return-Oriented Programming)在内的控制流劫持攻击。此外,文中还提到了一种相对宽松的CPS(Control-Flow Shadow)策略,它通过放宽条件限制实现高效防御。作者已将CPI和CPS的原型整合到LLVM编译器中,并计划将其纳入llvm的主线开发。CPI方法通过静态分析和运行时插桩确保所有代码指针的安全,将内存划分为安全区和常规区,限制对安全区的访问。该技术不关注数据攻击,假设攻击者可以控制内存但无法修改代码段,通过输入操纵进行读写。CPIProperty是文档中定义的关键概念,涉及内存对象、控制流目标和指针解引用等概念。" CPI(Code-Pointer Integrity)是一种先进的安全防御机制,它的核心理念是确保所有代码指针(如函数指针和保存的返回地址)在执行过程中保持不变,以防止控制流被恶意篡改。CPI着重于防御控制流劫持攻击,这类攻击通常利用代码片段的组合绕过传统的安全措施。 在CPI中,程序的内存被分割为两个部分:安全区和常规区。安全区内的内存对象只有在编译时证明安全或经过动态安全检测后才能被访问,这确保了代码指针的完整性。相反,常规区则无需运行时检查,允许像未保护状态一样访问,降低了性能开销。 为了实施CPI,需要在编译时进行静态分析,找出所有需要保护的内存对象,并进行插桩处理,以监控对这些对象的访问。尽管这个过程需要源码,但它并不需要直接修改源码。作者已经将CPI实现为LLVM的一个编译选项,这表明CPI具有良好的可实践性和兼容性。 CPS(Control-Flow Shadow)作为CPI的一种变体,其条件更为宽松,但依然能提供高效的防御效果。CPS通过放宽某些限制来提高效率,虽然可能不如CPI严格,但仍能有效地防止控制流劫持。 攻击模型假定攻击者具有一定的能力,比如可以控制进程内存但无法改动代码段,可以通过输入操纵读写任意地址,但无法控制程序加载进程。这些假设保证了插桩的完整性,并确保安全区和常规区的划分可以在程序加载时正确进行。 CPIProperty是CPI技术中的一组关键属性,涉及到内存对象,它们是程序中分配的内存单元,如全局变量、局部变量和动态内存块。控制流目标是指位于代码段中的特定位置,如函数入口或返回地址。目标对象可以是内存对象或控制流目标。指针解引用则是通过指针访问这些目标,无论是数据访问还是控制流转移。 CPI和CPS为应对现代软件安全威胁提供了创新的解决方案,它们的引入和实践对于增强软件安全性具有重要意义。通过整合到LLVM这样的编译基础设施中,这些技术有望成为未来防止控制流劫持的标准手段。