Visual Studio 2010中的增强GS技术
在之前的文章中,我们提到了一些栈基漏洞(如MS08-067),由于攻击者具有高度控制权,GS技术并未设计用于缓解这些漏洞。然而,其他漏洞(如MS07-017中的ANI解析漏洞)如果GS cookie保护应用更广泛,本可以得到缓解。strict_gs_check编译指示被提及为实现更广泛覆盖的一种方式。
严格GS启发式规则的一个缺点是过于激进。它会GS保护任何具有地址取用局部变量的函数(即使是取用地址的整数)。MSEC进行了一些基本代码分析,并发现许多当前受GS cookie保护的函数实际上可证明是安全的。因此,在Visual Studio 2010版本中,我们决定对GS进行全面改进——增强GS:
- 增强GS启发式规则,考虑更多值得保护的局部变量范围。
- 实现新的优化,移除被识别为不必要的cookie。
任何cookie的增加都可能导致性能问题,既因为额外cookie检查的直接开销,也因为对代码生成和优化的其他方面(如内联)的间接影响。目标是使最终方案适用于整个系统——就像原始的GS工作一样——而不是像strict_gs_check代码编译指示那样的针对性方法。
Visual Studio 2010中的增强GS启发式规则
最高优先级是更新启发式规则,以保护像MS07-017中的ANIHEADER结构这样的数据结构。还有其他安全公告涉及纯数据结构的溢出。例如,考虑MS06-054中Office Publisher漏洞涉及的结构:
|
|
保护所有结构在额外cookie数量方面可能成本过高。我们决定增加GS视为潜在易受攻击的结构范围,仅包括那些不包含指针类型成员的结构。与读取文档/媒体或其他类型数据相比,组件从不受信任的文件读取指针值到本地内存的可能性似乎较小。因此,前一篇文章中的ANI结构和上面的STTBF Publisher结构都受到Visual Studio 2010增强GS启发式规则的保护。然而,如下定义的结构不受保护:
|
|
类似地,传统GS启发式规则仅保护元素大小为1或2字节的数组(如chars和wchars),而Visual Studio 2010增强GS启发式规则保护任何类型的数组,只要元素类型不是指针类型。
|
|
还有一些额外标准:数组需要超过2个元素才能符合条件,任何包含上述类型数组的结构都将受到保护,等等。然而,上面的两个例子捕捉了增强GS启发式规则设计覆盖的主要新情况。
值得一提的是,任何在传统GS启发式规则下被视为潜在易受攻击的变量,在新启发式规则下也被视为潜在易受攻击。通过围绕过去安全公告历史精心设计启发式规则,并与Microsoft内部产品团队的性能测量同步,我们相信这可以真正作为应用程序范围的缓解措施部署。
Visual Studio 2010中的增强GS优化
仅仅因为一个变量(由于其类型或大小)被视为潜在易受攻击,并不意味着其使用必然导致漏洞!这一洞察导致了一种新的编译器优化,计划用于Visual Studio 2010。具体来说,新优化识别安全变量使用的实例,并在这种情况下抑制GS cookie的生成。
例如,下面的代码片段通常会导致函数受GS保护,因为存在字符缓冲区。
|
|
对Temp缓冲区使用的分析表明,它永远不会溢出:其唯一用途是在memcpy指令中,复制的字节数受数组大小限制。在这种情况下,函数不需要GS保护,因此可以安全地优化掉。
总结
Visual Studio 2010引入了增强的GS启发式规则,通过将GS保护范围扩大到传统GS方案保护函数的精心目标超集,提供了显著的安全改进。
当然,编译器更改只是第一步。任何使用VS2010开发的应用程序都将受益于增强GS提供的改进安全性。在Microsoft内部,MSEC已经开始与几个产品团队合作,以便在Visual Studio 2010发布后,他们可以开始将未来版本迁移到更新的编译器,并利用增强的GS功能。同时,尝试即将推出的Visual Studio 2010测试版,并告诉我们您的想法!
相关文章链接
- MS08-067 and the SDL, SDL blog entry, Michael Howard, October 2008
- Lessons learned from the Animated Cursor Security Bug, SDL blog entry, Michael Howard, April 2007
- Hardening stack-based buffer overrun detection in VC2005 SP1, Michael Howard’s blog, April 2007
- #pragma strict_gs_check , MSDN C/C++ pre-processor reference.
发布内容“按原样”提供,不提供任何保证,也不授予任何权利。