减少漏洞利用
即使有很好的技术来防止在新代码中引入漏洞,或者检测现有代码中的漏洞,也必然会有大量的遗留代码。在可预见的未来,漏洞正在积极使用。因此,漏洞预防和检测技术可以辅之以减轻对剩余漏洞的利用的技术。这种缓解技术通常在执行基础结构中实现,即硬件、操作系统、加载程序或虚拟机,或者由编译器(所谓的“内联引用监视器”)。这些技术的一个重要目标是限制对性能的影响,并最大限度地提高与旧程序的兼容性。
攻击的运行时检测
(相关资料图)
程序执行的运行时监视是检测攻击的强大技术。原则上,在测试期间检测漏洞的程序监视器(在3.2动态检测中讨论)也可以在运行时用于检测攻击。例如,动态污点分析与动态检查受污染的数据是否影响生成的输出的解析树相结合,也被提议作为SQL注入攻击的运行时缓解技术。
但是,测试期间使用的监视器(在主题3中讨论)和运行时用于缓解攻击的监视器的性能要求存在重要差异。对于攻击的运行时检测,挑战在于识别可有效检测的属性冲突,这些冲突预期在程序的执行跟踪中保持不变。使用了多种技术:
•堆栈Canary检测调用堆栈上激活记录完整性的违规行为,从而检测一些利用内存管理漏洞修改返回地址的攻击。
•无执行(NX)数据存储器检测到将程序计数器定向到数据存储器而不是代码存储器的尝试,因此可检测许多直接代码注入攻击。
•控制流完整性(CFI)是一类技术,用于监视程序的运行时控制流是否符合预期控制流的某些规范,并且因此可以检测到许多代码重用攻击。
检测到攻击时,运行时监视器必须做出适当的反应,通常是终止受到攻击的程序。终止是确保攻击不会造成进一步损害的良好反应,但它当然会对可用性属性产生负面影响。
自动化软件多样性
漏洞的利用通常依赖于受攻击软件的实现细节。例如,利用内存管理漏洞通常依赖于运行时程序内存布局的详细信息。SQL注入攻击可能依赖于SQL查询发送到的数据库的详细信息。
因此,使漏洞更难利用的通用对策是使这些实现细节多样化。这以两种方式提高了攻击的标准。首先,攻击者更难在相同的系统上准备和测试他/她的攻击。由于多样化,针对攻击者计算机上安装的Web服务器的攻击可能会对受害计算机上的同一Web服务器失败。其次,构建同时针对多个系统的攻击更难。攻击者现在必须为他们想要攻击的每个系统构建定制的漏洞,而不是构建一次漏洞,然后对许多系统使用它。
这个想法最重要的实现是地址空间布局随机化(ASLR),其中代码,堆栈和/或堆内存的布局在加载或加载时随机化。运行。这种随机化可以是粗粒度的,例如,通过随机重新定位代码、堆栈和堆段的基址,或者细粒度地将代码存储器中各个函数的地址、激活记录在堆栈,或堆中的对象是随机选择的。
研究界已经研究了许多其他在编译时或安装时自动创建多样性的方法[28],但这种自动多样化也会给软件维护带来重要的挑战,如错误报告。可能更难解释,软件更新可能也必须多样化。
限制权限
利用软件漏洞会影响受攻击软件的行为,从而违反某些安全目标。通过对软件可以做什么施加一般限制,可以大大降低攻击的潜在损害。
沙盒是一种安全机制,其中软件在受控环境(“沙盒”)中执行,并且可以对沙盒中的软件可以访问的资源强制执行策略。沙盒可用于限制不受信任的软件,但也可用于减轻利用对易受攻击软件的影响:在成功利用软件后,攻击者仍受到沙盒。
沙盒的通用概念可以使用现代计算机系统提供的任何隔离机制进行实例化:沙盒可以是在虚拟机监视器的监督下运行的虚拟机,也可以是操作系统施加访问控制策略的进程。此外,已经为特定类别的软件开发了几种特定于目的的沙盒机制,例如,可以在虚拟主机环境中对网络和文件系统访问进行沙盒处理的监狱。Java运行时环境实现了一种沙盒机制,旨在包含不受信任的Java代码,或将代码与同一Java虚拟机中的不同利益相关者隔离开来,但多年来在该沙盒机制中发现了几个重大漏洞[29]。
分化是一种相关但更细粒度的安全机制,其中软件本身被划分为多个隔间,并且对每个隔间的特权强制执行一些界限。这再次需要一些底层机制来强制执行这些边界。例如,一个部分化的浏览器可以依靠操作系统进程访问控制,通过拒绝其文件系统访问来绑定其渲染引擎的权限。现在,渲染引擎中的软件漏洞利用已得到缓解,即使成功利用此漏洞,攻击者仍被阻止访问文件系统。非常细粒度的分化形式可以通过对象能力系统[22]实现,其中每个应用程序级对象都可以是一个单独的保护域。
为了缓解侧信道漏洞,可以将易受攻击的代码隔离在单独的内核或单独的硬件上,这样通过侧信道泄漏的信息就不再存在。攻击者可观察到。
软件完整性检查
在“可信计算”这一总称下,已经开发了广泛的技术来测量计算机系统的状态,并在该状态被认为不安全时采取适当的措施。一种代表性的技术是可信引导,其中为每个执行的程序累积测量值。对程序的任何修改(例如,由于成功的攻击)都将导致不同的测量。然后,可以强制规定,例如,只能从具有指定测量值的状态访问密钥。
Parnoetal.[30]对这类技术进行了很好的概述。
结论
软件实现漏洞有多种形式,可以通过各种对策来缓解。表1总结了本章中讨论的漏洞类别之间的关系,以及通常用于应对这些漏洞的相关预防、检测和缓解技术。
标签: