深入解析许可证日志服务漏洞的技术细节与缓解措施

本文详细介绍了Windows Server 2000中许可证日志服务(LLS)的漏洞技术背景、严重性评估及四种可能的堆内存破坏场景,并分析了实际利用的难度与缓解因素。

许可证日志服务漏洞的详细解析 | MSRC博客

安全研究与防御团队
作者:swiat
发布日期:2009年11月10日
阅读时间:约3分钟

今日,我们发布了安全更新MS09-064,旨在解决许可证日志服务(License Logging Service, LLS)中的一个漏洞。本文将深入探讨该服务的背景信息及漏洞的严重性。

背景

许可证日志服务(LLS)最初设计用于帮助客户管理采用服务器客户端访问许可证(CAL)模式的Microsoft服务器产品许可证。更多详细信息可参阅:http://support.microsoft.com/kb/824196。该服务自Windows Server 2008起已从Windows Server产品线中移除。在剩余受支持的平台中,此问题仅影响Windows Server 2000版本的LLS。

为何公告严重性为“严重”?

该公告被标记为“严重”基于以下原因:

  • 该服务在Windows Server 2000上默认启用。
  • 可通过匿名网络连接访问。
  • 底层问题可能导致广泛的堆内存破坏。

缓解因素有哪些?

有两种情况可能显著降低其严重性: 第一,LLS功能的最常见应用场景是在受信任的企业环境中管理CAL,这意味着对托管LLS的服务器的网络访问通常仅限于本地网络段,并通过防火墙、代理服务器或其他屏障与Internet隔离。 第二,该问题导致内存破坏,但根据我们的分析,将其转化为远程代码执行非常困难。

技术细节

问题的根本原因在于缺乏对字符串是否以NULL字符结尾的验证。未经验证且缺少NULL终止的字符串可能被传递给某个函数,该函数执行以下步骤:

  • 计算未验证字符串的长度。
  • 使用计算出的长度及其他字符串的长度为新字符串分配缓冲区。
  • 在新缓冲区中连接两个字符串。

由于未验证字符串的长度计算可能超出字符串缓冲区(因缺少NULL终止),根据执行时的堆内存布局,我们可能遇到四种不同场景:

  1. 在字符串长度计算期间,代码超出字符串缓冲区并命中未分配的内存页,导致读取访问违规。
  2. 在字符串长度计算期间,代码在字符串缓冲区之外找到NULL终止字符,返回夸张的长度。终止字符位于为新字符串分配的内存块之前的较低地址。夸张的字符串与其他字符串在新缓冲区中连接,不会引发内存访问异常,因为新缓冲区的长度是使用“夸张”长度计算的。
  3. 在场景2中,另一个线程拥有包含用于长度计算的NULL终止字符的内存块,在长度计算之后、字符串连接之前更改内存内容。这导致在连接期间发生新的缓冲区溢出,引发半可控的堆破坏和/或写入访问违规。
  4. 在场景2中,为新字符串分配的内存块包含NULL终止字符。该字符在连接过程中被覆盖,导致广泛的内存复制并引发写入访问违规。

场景3依赖于非常狭窄的竞争条件,因此任何利用尝试都可能不可靠。唯一可能导致可靠利用的场景是场景4。这使我们得出结论:此漏洞在现实中的利用可能性较低。

-Greg, MSRC工程团队

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计