DNS事务ID可预测性漏洞解析与修复

本文详细分析了MS08-020安全更新中DNS客户端解析器事务ID生成算法的弱点,解释了攻击者如何预测TXID进行DNS欺骗攻击,并介绍了微软采用CryptGenRandom()加密安全PRNG的修复方案。

MS08-020:DNS事务ID的可预测性如何?

今天,我们发布了MS08-020安全更新,以解决DNS客户端解析器中事务ID(TXID)生成算法的一个弱点。TXID是一个16位实体,主要用作DNS服务器/客户端之间的同步机制;实际上,您可以将其视为DNS查询/响应交换的初始序列号(ISN)。因此,TXID本应具有一定程度的随机性且难以预测。如果TXID和主机名都可预测,攻击者可以伪造恶意DNS回复,而DNS客户端解析器会认为这些回复来自合法的DNS服务器。客户端随后将使用欺骗信息连接到(可能)由攻击者控制的IP。

我们想进一步解释这个弱点,以帮助您识别网络上的潜在攻击。请记住,攻击者需要在合法DNS服务器用有效响应回复之前,在欺骗响应中精确匹配请求TXID。我们之前实现的PRNG算法较弱,因此容易受到预测攻击,这为攻击提供了便利。给定先前的连续TID,x_n、x_{n+1}、x_{n+2},攻击者可能能够确定PRNG状态并以高度置信度预测x_{n+3}、x_{n+4}等。旧的TXID生成算法如下(修订后的伪代码以确保技术准确性):

1
2
3
4
5
GlobalSeed++;
SomeNumber = (WORD)GetTickCount()+(SomeRandomAddress>>6)+GlobalSeed;
SomeNumber = (SomeNumber%487)+1+GlobalLastTXID);
GlobalLastTXID = SomeNumber;
XID = SomeNumber^XIDMask;

以下是旧客户端解析器发送的顺序TXID日志。请注意位位置4、5、6、7和8中出现的可预测模式。

如您所见,即使存在此弱点,攻击者也无法精确预测保证的下一个TXID。但这些中间位的有限熵确实大大减少了预测下一个TXID的搜索空间。如果您正在监视网络上的攻击,请继续寻找与先前DNS欺骗攻击相同的模式:针对单个主机客户端查找的数千个不同TXID的DNS“回复”的稳定洪流。

为了解决这个弱点,我们简单地用加密安全的PRNG替换了算法:CryptGenRandom()。您可以在http://msdn2.microsoft.com/en-us/library/aa379942(VS.85).aspx上了解其工作原理。

博客更新 - 4月29日:修订了上述伪代码以确保技术准确性。

  • 安全漏洞研究与防御博客作者
    发布内容“按原样”提供,不提供任何保证,也不授予任何权利。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计