攻击者可通过诱使 DNS 解析器高速缓存错误信息来使 DNS 高速缓存中毒,其结果是解析器将错误 IP 地址发送给客户端,而尝试导航到网站的用户将被定向到错误位置。
阅读本文后,您将能够:
相关内容
订阅 TheNET,这是 Cloudflare 每月对互联网上最流行见解的总结!
复制文章链接
DNS 缓存投毒是指向 DNS 缓存中输入错误信息的行为,以便使 DNS 查询返回错误响应并将用户定向到错误网站。DNS 缓存投毒也称为“DNS 欺骗”。IP 地址是互联网的“电话号码”,它能够使网络流量到达正确的位置。DNS 解析器缓存类似于“通讯录”,其中会列出所有电话号码以及它们存储错误信息的时间,在缓存的信息得到更正之前,流量将会传输到错误的位置。(请注意,这实际上并未断开真实网站与相应的真实 IP 地址之间的连接。)
因为 DNS 解析器通常无法验证其缓存中的数据,因此错误 DNS 信息会保留在缓存中,直到生存时间(TTL)到期或手动将其移除为止。许多漏洞可能使 DNS 中毒,但主要问题是 DNS 是为远远更小的 Internet 构建的,并且基于信任原则(非常类似于 BGP)。一种更安全的 DNS 协议称为 DNSSEC,其旨在解决其中的一些问题,但尚未得到广泛采用。
DNS 解析器为客户端提供与域名关联的 IP 地址。换句话说,它们将例如“cloudflare.com”等人类可读的网站地址转换为机器可读的 IP 地址。域名服务将域名转换为计算机可读的 IP 地址。当用户尝试导航到某个网站时,其操作系统将向 DNS 解析器发送请求。DNS 解析器使用 IP 地址进行响应,然后 Web 浏览器使用该地址开始加载此网站。
DNS 解析器会将对 IP 地址查询的响应保存一定的时间。这样,解析器便可更快地响应未来查询,并且无需与典型 DNS 解析过程中涉及的许多服务器进行通信。只要与该 IP 地址关联的指定生存时间 (TTL) 允许,DNS 解析器就会将响应保存在其高速缓存中。
DNS 未缓存响应:
DNS 已缓存响应:
攻击者可通过假冒 DNS 域名服务器,向 DNS 解析器发出请求,然后在 DNS 解析器查询域名服务器时伪造答复,使 DNS 缓存中毒。这之所以可能,是因为 DNS 服务器使用 UDP 而非 TCP,并且当前没有对 DNS 信息的验证。
DNS 缓存中毒过程:
中毒的 DNS 缓存:
DNS 请求和响应使用 User Datagram Protocol (UDP),而不是使用 TCP,TCP 会要求通信双方都进行“握手”来启动通信。使用 UDP 时,无法保证连接已打开或收件人的设备已准备就绪。因此,UDP 很容易被伪造,也就是说,攻击者可以通过 UDP 发送信息,并通过伪造标头数据来假装这是来自合法服务器的响应。
如果 DNS 解析器收到伪造的响应,它会不加鉴别地接受并缓存这些数据,因为无法验证这些信息是否正确且来自合法来源。DNS 是在 Internet 早期诞生的,与之相连的唯一参与者是大学和研究中心。那时没有理由预计有人会传播虚假 DNS 信息。
尽管 DNS 缓存过程中存在这些主要漏洞,但 DNS 中毒攻击并非易事。由于 DNS 解析器实际上确实查询权威性域名服务器,因此在权威性域名服务器作出真实答复前,攻击者只有几毫秒的时间来发送虚假答复。
攻击者还必须知道或猜测许多因素才能进行 DNS 欺骗攻击:
攻击者还可通过其他某种方式访问 DNS 解析器。如果恶意方对 DNS 解析器进行操作、黑客入侵或获得其物理访问 权,他们能够更轻松地更改缓存的数据。
*在网络连接中,端口是指通信接收的虚拟点。计算机拥有多个端口,每个端口有自己的编号。并且端口用于计算机之间的通信,还必须指定某些端口用于进行某些类型的通信。例如,HTTP 通信始终使用端口 80,HTTPS 通信始终使用端口 443。
多个政府有意在其国家/地区中使 DNS 缓存中毒,以便拒绝对特定网站或网络资源的访问。
DNSSEC 是 Domain Name System Security Extensions 的简称,这是一种验证 DNS 数据完整性和来源的方法。DNS 在最初设计时没有此类验证,这就是 DNS 有可能中毒的原因。
与 TLS/SSL 非常类似,DNSSEC 使用公钥加密(对信息进行数字签名的方式)来核实和验证数据。DNSSEC 扩展发布于 2005 年,但 DNSSEC 尚未成为主流,这使得 DNS 仍然容易受到攻击。