域名漏洞:以DNS服务器逻辑性为突破口的安全威


所谓DNS,是一套将人类可读的域名转化为计算机可识别IP地址的命名系统。每当一条尚不存在于解析器缓存中的域名查询请求出现,这一转化过程就会在从根服务器到顶级域名(例如.com型域名)的整个DNS层级体系中走上一遍。接下来顶级域名(简称TLD)会把能够向我们提供所需IP地址的已授权域名服务器找到,并将相关信息提交回来。在我们从域名服务器获取到对应的域名信息之后,结果将带着一个特定的TTL值(即有效时间值)进入DNS解析程序缓存,最终在有效期结束时被清出。

有些时候,某个域会被认定为恶意对象并遭到清除。出现这种情况的原因可谓多种多样,例如恶意软件传播、钓鱼感染等。一般来说,防止用户对某个域发起访问的常见方式是将该域从TLD服务器中删除。然而这还不足以彻底消除安全隐患,因为域仍然能够再次由解析程序解析,并在下一次TTL过期之前始终处于可用状态。通常情况下这算不得什么大问题,因为TTL值生效时间本身就很短,所以攻击型域的存在时间可能只有数秒或者数分钟。

在本文中,我们将讨论近来存在于大多数DNS服务器中的DNS漏洞。此漏洞是由江坚、梁津津、李康、李军、段海心以及吴建平等多位研究人员共同发现的。点击此处可以查看他们的研究论文。

该漏洞的突破口在于某些DNS服务器中的缓存更新逻辑缺口。此漏洞允许缓存以特定方式被改写,进而导致某个特定域将在缓存中拥有源源不断的TTL授权数据,且TTL值不受有效时间所限。这样一来,即使该域被从TLD服务器中清出,也仍然会一直处于可解析状态。此种类型的域如今有了自己的名号:幽灵域名(即Ghost Domain Name)。

DNS基础知识

首先,让我们先来了解DNS解析工作是如何进行的。

比如说,用户打开浏览器并在地址栏中输入infosecinstitute.com内容。这时用户操作系统中的DNS解析程序就会运作起来,尝试为该域名找出对应的IP地址。解析程序首先会检查本地缓存,以确认该查询域名是否在缓存中存在记录。缓存中通常保存着最近一段时间内用户使用过的IP地址与主机名称映射,这样解析程序就不必重复再重复地为同一个域名多次获取IP地址。如果解析程序在缓存中无法找到对应的IP地址,那么接下来它就要向DNS服务器发送请求,检查是否存在该域名的记录。DNS服务器通常由我们的网络服务供应商(简称ISP)提供,当然大家也可以为自己进行手动选择。如果此时仍然查找不到记录,解析程序就会向不同的域名服务器发送循环DNS查询,以期找到所查域名。当IP地址被寻获时,解析程序会在将地址发回用户端的同时保存在缓存中,以方便今后的使用。