栈溢出(栈耗尽)与栈缓冲区溢出的区别
定期我们会收到关于客户端应用程序(如 Internet Explorer、Word 等)中栈耗尽的报告。这些是有效的稳定性错误,幸运的是,它们本身不会导致可利用的条件(没有权限提升的潜力)。我们想澄清栈耗尽和栈缓冲区溢出之间的区别。栈缓冲区溢出通常会导致权限提升。不幸的是,文献倾向于使用“栈溢出”来指代这两种情况,因此造成了混淆。错误代码 STATUS_STACK_BUFFER_OVERRUN
(0xc0000409) 指的是栈缓冲区溢出,而错误代码 STATUS_STACK_OVERFLOW
(0xc00000fd) 指的是栈耗尽。
今天早上在 Bugtraq 上,有一个公开的栈耗尽错误帖子,幸运的是,它不会导致任意代码执行。让我们仔细看看它和其他几个例子。我们从今天的 Bugtraq 帖子开始:
|
|
当 IE 尝试解析此 HTML 时,它会耗尽栈空间。连接 Windbg,您将观察到以下首次异常:
|
|
栈只是耗尽了,在这种情况下没有运行任意代码的可能性。让我们看看其他几个例子。
下一个问题最近也在 IE 中报告:
|
|
同样,HTML 请求了异常大量的栈空间。IE 尝试分配空间,最终耗尽。无法处理 HTML,它返回栈溢出/耗尽错误 (0xc00000fd)。
最后一个例子来自 2008 年 4 月,同样导致栈溢出/耗尽错误 (0xc00000fd):
|
|
如您所见,有几种方法可以达到栈耗尽条件。幸运的是,这些是稳定性问题,本身不会导致远程代码执行。当解析客户端应用程序无法分配足够的栈空间来完成操作时,就会发生这种情况(如这里的例子所示,网页试图分配尽可能多的栈空间,最终耗尽空间)。
我们总是乐于处理发送到 secure@microsoft.com 的错误报告。请将它们发送给我们。我们 definitely 致力于工程和安全卓越。我们评估每个报告,并决定是将其作为安全问题处理,还是将其交给产品团队作为可靠性和稳定性问题修复。对于每个安全问题,我们将根据 SDL bug bar(链接到示例 bug bar)进行分流,并通过 MSRC 安全公告流程处理。所有问题(如这些栈耗尽错误)如果是稳定性或可靠性问题,将根据客户影响进行分流,并在产品的未来版本中解决。
更新于 1 月 29 日:感谢 Mark Dowd 指出,栈耗尽错误如果与缓冲区溢出错误结合,可能会产生安全影响。您可以在 https://www.blackhat.com/presentations/bh-usa-07/Dowd_McDonald_and_Mehta/Whitepaper/bh-usa-07-dowd_mcdonald_and_mehta.pdf 阅读更多关于他的研究。
- Jonathan Ness, SVRD 博主 发布内容“按原样”提供,不提供任何保证,也不授予任何权利。
参考文献:
-
STATUS_STACK_OVERFLOW
(0xc00000fd): -
STATUS_STACK_BUFFER_OVERRUN
(0xc0000409):- 分析崩溃以查找应用程序中的安全漏洞 http://msdn.microsoft.com/en-us/magazine/cc163311.aspx
可利用性 | 全披露 | Internet Explorer (IE)