软件防御系列:漏洞利用缓解与漏洞检测
软件防御是一个需要多管齐下的广泛主题,包括:
- 与安全开发相关的流程和工具(我们尝试将其封装在Microsoft SDL中)
- 使攻击者更难利用特定漏洞的核心操作系统对策
- 保护软件运行的硬件安全的步骤
- 对主机上其他软件(如Windows Defender执行的)的实时分析… 这些都在发挥作用。本系列的重点是前两个方面,更具体地说,是Windows操作系统与Visual Studio版本中包含的工具链如何共同改善软件防御状态,特别是在漏洞利用缓解和漏洞检测方面。
近年来,内存安全漏洞的利用一直是攻防双方积极研究的领域。在本系列中,我们通过示例概述了提高代码质量和弹性的方法,既适用于Microsoft产品,也适用于在Microsoft平台上运行的第三方代码。
从高层次来看,有两种方法,在前文中用"质量"和"弹性"两个词概括:
- 弹性
我们投资于漏洞利用缓解措施,使产品中的任何残留错误:
- 难以利用——从而提高攻击者的成本
- 不可靠地利用——从而最小化攻击者的投资回报,因为不可靠的漏洞利用更有可能被检测并报告给Microsoft或其他安全厂商
安全科学在保护客户方面的影响提供了一些历史数据,说明了过去部署此类缓解措施的效果。我们最近宣布的"缓解绕过悬赏"和"BlueHat防御计划"也强调了我们对漏洞利用缓解措施的重视。除了描述漏洞利用缓解的最新改进外,本系列还将强调我们在设计和开发过程中面临的一些不太明显的挑战,包括:
- 特定措施将如何影响向后应用程序兼容性
- 在运行时成本、内存开销和代码大小方面的性能影响
该系列的第一篇文章回顾了连续的Windows和VC++版本如何实现对堆和栈损坏漏洞的广泛加固。然后我们将继续描述通用漏洞利用缓解措施(如DEP/ASLR)的状态,这些措施直接针对攻击者技术,而不是任何特定类别的漏洞。
在研究了这些通用方法之后,接下来的文章将回顾针对特定类别代码缺陷的更针对性运行时措施,如引用计数问题、通过内核模式空指针解引用的本地权限提升和整数溢出错误。
- 质量 我们将通过描述我们在开发过程中通过编译时源代码分析静态检测更多错误的能力来结束本系列,从而使许多问题在产品发布前得到修复。特别是,我们将重点介绍最新Visual Studio版本中的新安全相关警告,以及如何将它们直接应用于您自己的应用程序中。
为了提高准确性并最小化噪音,此类检测技术通常高度针对非常特定的代码缺陷:虽然保护范围因此仅限于特定的错误类别,但它们确实提供了完全根除该错误类别的潜力。
在后续文章中,我们将更详细地讨论适用范围与保护完整性之间的平衡。我们还将讨论与应用程序兼容性相关的权衡,以及在考虑将新的安全进展向后移植到旧平台时引发的问题。
上述许多项目单独来看可能显得毫无关联。本系列是一个机会,可以强调我们所追求的各种互补方法之间的一些联系和基本原理,以及我们在此过程中面临的工程挑战。希望您觉得有趣。
MSEC安全科学团队