理解卡明斯基 DNS 漏洞

作者:Cory Wright

在过去几天里,关于丹·卡明斯基两周前宣布的 DNS 漏洞的细节已经浮出水面。是的,它像我们被告知的那样严重和可怕。

您可能 还记得,卡明斯基与许多主要的软件供应商协调发布了公告,并承诺在 8 月 6 日在拉斯维加斯举行的年度黑帽安全大会之前,不会透露利用该漏洞的方法。这将给 ISP 30 天的时间来修补他们的系统并保护他们的用户。卡明斯基还要求安全社区的成员在官方宣布细节之前,不要公开猜测这个问题。这可能要求过高了,因为这个问题只用了 13 天就进入了公众视野。

既然细节已经公开,卡明斯基本人也对此发表了评论,那么让我们来探讨一下这个问题,并尝试理解它到底有多严重。

DNS 基础知识

首先,我们需要了解 DNS 流量如何运作的基本知识。典型的场景中有三个参与者

  • 您的计算机,
  • 您的 ISP 的递归 DNS 服务器,以及
  • 网站的权威 DNS 服务器

权威 DNS 服务器发布域名对应的 IP 地址。递归 DNS 服务器与权威服务器通信,以查找这些域名的地址。您的计算机只与递归 DNS 服务器通信,后者为您查找域名地址。您的计算机和 ISP 的递归 DNS 服务器都是解析器的一种类型,它们在其他地方寻找答案。当然,这是该过程的简化版本,但这足以满足我们的目的。

现在让我们看一下典型的 DNS 请求和响应。在本例中,我们将使用 example.com 和几个虚假的 DNS 服务器。(不必要的 dig 输出已被删除)

    $ dig @ns1.example.com www.example.com
    ;; ANSWER SECTION:
    www.example.com.    120      IN    A    192.168.1.10
    
    ;; AUTHORITY SECTION:
    example.com.        86400    IN    NS   ns1.example.com.
    example.com.        86400    IN    NS   ns2.example.com.
    
    ;; ADDITIONAL SECTION:
    ns1.example.com.    604800   IN    A    192.168.2.20
    ns2.example.com.    604800   IN    A    192.168.3.30

这里我们查询了一个权威 DNS 服务器 ns1.example.com,并请求 www.example.com 的地址。正如您所看到的,响应包含 www.example.com 的 IP 地址,以及另外两组记录:权威记录和附加记录。权威部分仅包含问题域的权威 DNS 服务器列表。附加部分包含这些服务器的 IP 地址。所有这些信息都在一个响应中返回,这对于最近的漏洞利用至关重要。

Bailiwick 检查

考虑以下类比。假设你和我正在高速公路上旅行,我们的汽车抛锚了。我问你当地修理店的电话号码,你回答说:“我不知道他们的电话号码,你应该打电话给他们查一下。” 如果我事先不知道修理店的电话号码,我怎么能打电话给他们来了解他们的电话号码呢?

现在让我们考虑一下 DNS 中类似的情况。我们想找到 www.example.com 的地址,所以我们向根 DNS 服务器请求 .com DNS 服务器列表。根服务器给了我一个 .com DNS 服务器列表,所以我们选择一个并向它请求 example.com 的 DNS 服务器列表。如果 .com 服务器只是回复 ns1.example.com 和 ns2.example.com,我们就会卡住。我们正在尝试查找关于 example.com 的信息,但在途中,我们被告知向 example.com DNS 服务器寻求答案。为了解决这个鸡和蛋的问题,在附加部分提供了两条“A”记录来提供缺失的链接。这些被称为“胶水”记录。

胶水记录只是与响应一起提供的普通“A”记录。上面的响应也可能很容易包含无关的记录

    $ dig @ns1.example.com www.example.com
    ;; ANSWER SECTION:
    www.example.com.    120      IN    A    192.168.1.10
    
    ;; AUTHORITY SECTION:
    example.com.        86400    IN    NS   ns1.example.com.
    example.com.        86400    IN    NS   ns2.example.com.
    
    ;; ADDITIONAL SECTION:
    ns1.example.com.    604800   IN    A    192.168.2.20
    ns2.example.com.    604800   IN    A    192.168.3.30
    www.linuxjournal.com. 43200  IN    A    66.240.243.113

注意到末尾的额外行了吗?这里我们询问了关于 example.com 域中的内容,但这个鬼鬼祟祟的服务器也回复了关于 www.linuxjournal.com 的信息。这个服务器甚至被授权响应 linuxjournal.com 的 DNS 请求吗?解析器使用一种称为 bailiwick 检查的技术来确定是否接受这些额外的记录。这仅仅意味着任何不在问题域中的记录都将被忽略。如果我们请求关于 ftp.example.com 的信息,那么我们只接受附加部分中关于 example.com 的信息。

自 1997 年左右以来,几乎所有现代 DNS 解析器都使用 bailiwick 检查来保护自己免受这种类型的缓存中毒攻击。

UDP 和查询 ID

大多数 DNS 流量通过 UDP 发送,UDP 是一种无连接协议。这意味着解析器(您的计算机或递归 DNS 服务器)发出请求,然后简单地等待任何人告知答案。通常会同时发出许多 DNS 请求,因此解析器需要一种方法将它提出的问题与其收到的答案相匹配。为此,每个请求都使用一个介于 0 和 65536 之间的数字进行,称为查询 ID (QID)。服务器总是使用与请求中收到的 QID 相同的 QID 返回答案。

已经有几个基于猜测 QID 的漏洞利用。在过去,解析器只是简单地递增 QID,这使得猜测它们变得极其容易。在被利用之后,大多数 DNS 解析器开始对 QID 使用伪随机数。由于 QID 是一个 16 位数字,因此只有一小部分可供选择(只有 65536 个)。安全研究人员已经演示了预测这些随机数的方法。

漏洞利用

现在我们已经介绍了基础知识,让我们来了解卡明斯基的漏洞利用。

想象一下,一个解析器请求 doesnotexist.example.com 的 IP 地址。攻击者发回一个看起来像这样的响应

    $ dig doesnotexist.example.com
    ;; ANSWER SECTION:
    doesnotexist.example.com.  120   IN  A    10.10.10.10
    
    ;; AUTHORITY SECTION:
    example.com.             86400   IN  NS   www.example.com.
    
    ;; ADDITIONAL SECTION:
    www.example.com.        604800   IN  A    10.10.10.20

攻击者试图欺骗解析器,使其相信 www.example.com 现在位于 10.10.10.20,并记住 604800 秒(7 天)。这通过了 bailiwick 检查,因为权威部分和附加部分中的域与答案中的域相同。但请记住,响应仍然需要包含相同的 QID,解析器才会接受响应。但是,由于大多数流量是通过 UDP 发生的,因此无法阻止攻击者向解析器发送大量响应。但是,向从未被问过的问题发送答案将是毫无意义的。此外,攻击者的响应需要比真实的响应更早到达。

此外,攻击者可能很难猜测会提出哪些问题。相反,攻击者可以设置一个网页,其中包含大量图片 - 假设 1000 张图片,指向不同的域,如下所示

    <img src="http://aaaa.example.com/image.jpg"/>
    <img src="http://aaab.example.com/image.jpg"/>
    <img src="http://aaac.example.com/image.jpg"/>

当浏览器尝试渲染此页面时,它将要求解析器查找 aaaa.example.com、aaab.example.com 等的地址,直到它查找完所有 1000 个地址。在此过程中,它将使用从 1 到 65535 的不同 QID 发送这些请求。例如,如果攻击者不断地向解析器发送 QID 为 12345 的答案,它最终将拥有正确的 QID,并且响应将被接受。(如果这有助于理解,您也可以想象攻击者同时发回 65536 个不同的响应,每个响应都有不同的 QID,然后您可以确定问题将收到答案。)

但是 bailiwick 检查呢?请记住,攻击者不控制 example.com,他只是向解析器发送他自己的答案,因此他可以精心制作响应,使其看起来在 bailiwick 范围内。响应可能看起来像这样

    ;; ANSWER SECTION:
    aaaa.example.com.    120    IN    A    10.10.10.10
    
    ;; AUTHORITY SECTION:
    example.com.        86400   IN    NS   www.example.com.
    
    ;; ADDITIONAL SECTION:
    www.example.com.    604800  IN    A    10.10.10.20

攻击者已向您的解析器发送了响应,并指示它将 10.10.10.20 存储为 www.example.com 的 IP 地址,并保持 7 天。此外,任何其他 DNS 请求都将被发送到那里,因为 NS 记录也被缓存了。

在这个漏洞利用中,问题是什么并不重要,权威部分和附加部分将始终相同。重要的是他的响应比真实的响应更早到达,对于这些请求中的任何一个。通过用答案淹没解析器,攻击者提高了其中一个答案被接受的机会,任何一个答案都可以。卡明斯基发现了一种将 QID 弱点与 bailiwick 欺骗结合起来以进行缓存中毒的方法。

在最近的补丁发布之前,如果一个浏览网页的人访问攻击者的网页,那么该 ISP(Comcast、AT&T、Verizon 等)的所有其他人都会受到攻击。ISP 的递归 DNS 服务器可以将所有 www.bankofamerica.com 的流量发送到由道德败坏的人运营的 IP。

漏洞利用是真实的

是的,这个漏洞利用是真实的,而且很严重。著名专家,O'Reilly 出版的无处不在的“DNS 和 BIND”一书的作者 Cricket Lui 暗示 这可能是互联网历史上最大的 DNS 安全问题,大多数其他专家似乎也同意他的观点。丹·卡明斯基曾说过,他能够在不到 10 秒的时间内利用系统。这意味着丹可以在几秒钟内控制您的银行帐户、您的电子邮件、您的 eBay 帐户或您在网上做的任何其他事情。而且您甚至不必做任何事情。您的 ISP 的成千上万或数十万客户中的任何一个都可能中招,并且会影响到您。这就是为什么立即修补这些系统如此重要。

访问丹·卡明斯基的网站 DoxPara Research,点击右侧的“检查我的 DNS”按钮,查看您的 ISP 是否已打补丁。如果您仍然容易受到攻击,您应该考虑暂时使用 OpenDNS

加载 Disqus 评论