许可证日志服务漏洞的详细解析 | 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终止),根据执行时的堆内存布局,我们可能遇到四种不同场景:
- 在字符串长度计算期间,代码超出字符串缓冲区并命中未分配的内存页,导致读取访问违规。
- 在字符串长度计算期间,代码在字符串缓冲区之外找到NULL终止字符,返回夸张的长度。终止字符位于为新字符串分配的内存块之前的较低地址。夸张的字符串与其他字符串在新缓冲区中连接,不会引发内存访问异常,因为新缓冲区的长度是使用“夸张”长度计算的。
- 在场景2中,另一个线程拥有包含用于长度计算的NULL终止字符的内存块,在长度计算之后、字符串连接之前更改内存内容。这导致在连接期间发生新的缓冲区溢出,引发半可控的堆破坏和/或写入访问违规。
- 在场景2中,为新字符串分配的内存块包含NULL终止字符。该字符在连接过程中被覆盖,导致广泛的内存复制并引发写入访问违规。
场景3依赖于非常狭窄的竞争条件,因此任何利用尝试都可能不可靠。唯一可能导致可靠利用的场景是场景4。这使我们得出结论:此漏洞在现实中的利用可能性较低。
-Greg, MSRC工程团队