互联网的飞速发展,把人们带入了一个新的时代。一方面,人们享受着互联网带来的便捷多彩的生活,另一方面,个人信息安全也正面临者新的挑战。
如今的互联网,时时刻刻都在发生网络***、病毒传播。一边是攻,另一边是防,可以说这是一场没有硝烟的持久战。战争推动了环境变革,战争也推动了武器的升级。本文站在DNS安全角度,简单聊聊DNS缓存投毒的原理与防御机制。
【第一 DNS介绍】
DNS(域名系统 Domain Name System)是一个多层次的分布式数据库系统,它基本的功能是完成域名解析,即提供域名和IP 地址之间的映射关系,属于互联网(Internet)的基础设施,为互联网(Internet)上用户提供便利。
【第二 DNS的工作原理概述】
在分析DNS 缓存投毒***原理之前,先了解一下DNS 解析过程。
假设我们在客户端上要查询的域名为www.test.com,并且客户端和我们的本地缓存DNS满足如下条件:
(1)客户端是首次访问www.test.com,即客户端本地没有缓存记录。
(2)本地缓存DNS中没有www.test.com的缓存记录,当然,本地缓存DNS肯定不是www.test.com的权威DNS。
那么,客户端发起www.test.com查询请求后的过程如下图所示:
(1)客户端向本地缓存DNS发起递归查询www.test.com 的请求。
(2)本地缓存DNS检查本地资源记录,若存在则作授权回答;若不存在,则检查本地缓存,如存在则直接给客户端返回结果。若本地资源记录和缓存中都不存在,则向根DNS发起迭代查询。
本例中本地缓存DNS向根DNS发起www.test.com的迭代查询。
(3)根DNS返回com 域的权威名字服务器(即顶级域DNS)的NS记录和对应IP地址。
(4)本地缓存DNS继续向顶级域DNS发起www.test.com的迭代查询。
(5)顶级域名服务器返回test.com域的权威DNS的NS记录和IP地址。
(6)本地缓存DNS继续向test.com的权威DNS发起www.test.com的迭代查询。
(7)test.com的权威DNS应答www.test.com的查询请求。
(8)本地缓存DNS将应答结果保存在本地缓存,并将结果应答给客户端。
【第三 DNS缓存投毒***】
DNS缓存投毒***可以分为传统的缓存投毒***和Kaminsky缓存投毒***。但无论传统的DNS缓存投毒还是后来出现的Kaminsky缓存投毒均出现在下图红色区域,即权威DNS应答本地缓存DNS发起的迭代请求的过程中。
【第四 传统的DNS缓存投毒***】
由于DNS 采用UDP 协议传输查询和应答数据包,属于简单信任机制。对接收到的应答数据包仅进行原查询包IP 地址、端口和随机查询ID 的确认,而不会对数据包的合法性做任何分析。如果若匹配,则接受其作为正确应答数据包,继续DNS 解析过程,并丢弃后续到达的所有应答数据包。这就使得***者可以仿冒权威名字服务器向缓存DNS 服务器发送伪造应答包,力争抢先完成应答以污染DNS 缓存。
如果***者发送的伪造应答包在权威DNS发送的正确应答包之前到达缓存DNS 服务器,并与原查询包IP 地址、端口和随机查询ID 相匹配,就能够成功污染DNS 缓存。
例如,***者伪造上面的test.com权威应答内容,将www.test.com的A记录修改成一个非法的IP地址比如1.1.1.1,且伪造权威DNS的IP地址、端口号以及查询ID提前一步应答给本地缓存DNS,那么本地缓存DNS就会将此内容视为合法,并缓存到本地然后应答给客户端。即使后来真正的应答到了本地缓存DNS,那也没办法再改变。
【第五 传统的DNS缓存投毒的缺陷】
根据DNS的工作原理可知:被***的域名只有在本地缓存DNS中没有缓存,那么才有可能***成功。本地缓存DNS中已经存在该域名的缓存,那么***者只能等到该域名缓存的生存时间(TTL)过期后再组织下一次***。这样的***效率和命中率是比较低的。
【第六 Kaminsky缓存投毒***】
2008 年的夏天,Dan Kaminsky 发现了一种新型DNS 缓存投毒***,该***的方式一经公开立即引起了网络安全界的广泛关注。
Kaminsky缓存投毒***克服了传统DNS 缓存投毒***存在的***所需时间长、成功率很低的缺陷。其***原理如下:
(1)***者向被***的本地缓存DNS发送一个域名的DNS 查询请求,该查询请求中的域名主机使用随机序列和目标域名的组合。
例如www123456.test.com,其中ns2.test.com为目标域名,www123456是随机生成的。很显然,这个查询的域名主机记录在test.com的权威DNS中是不存在的。正常test.com的权威DNS要返回NXDOMIAN(代表域名不存在)。换句话说就是本地缓存DNS中肯定没有www123456.test.com的缓存记录,本地缓存DNS接收到这个域名查询请求后肯定是要出去迭代请求的。
(2)***者伪造test.com的权威DNS应答数据包中,应答资源记录部分与正确应答包中部分是与正常结果一样的,比如test.com的DNS的IP地址、UDP端口号、应答结果是NXDOMAIN。
但是,在应答报文中的授权资源记录部分,***者伪造一个test.com的NS记录为ns2.test.com,且该记录对应的A记录IP是2.2.2.2(可能是一个钓鱼网站的IP)。那么该资源记录信息将也被写入本地缓存DNS的Cache 中,在Cache 保持时间内,对test.com名字服务器所管辖的所有域名的查询都将被发送到***者自己控制的IP(2.2.2.2)中。
通过dig命令测试类似报文应答内容如下。
【第七 Kaminsky缓存投毒的优势】
传统DNS 缓存投毒***中,存在***所需时间长、***成功率低的问题,而Kaminsky ***克服了这一缺陷。因为Kaminsky ***中,每次查询都会在目标域名上添加随机序列,这使得在被***的本地缓存DNS的 Cache 中根本就不存在各个临时构造域名主机的记录,因此若***不成功,则立即更换随机序列连续不断地进行***,不存在有效***时间的问题进而提升了***成功率。
传统DNS 缓存投毒***成功后,只是污染了该与权威区中的某个域名,而Kaminsky ***成功后,污染的是本地缓存DNS Cache中一个域名主机的NS记录(即该域名的权威主机记录),之后对该名字服务器管辖的所有域名主机的查询都将被发送到***者控制的IP 地址中,破坏力度远高于传统缓存投毒***。
【第八 缓存投毒***防护】
最后,我们来说说如何做好DNS的防护,降低DNS被缓存投毒的风险。简单总结大概有以下几点:
(1)作为权威域名的负责方,要尽量的部署多台权威DNS,比如一主多备。这样能有效的防止自己域名被投毒。
例如,test.com区,本来只有一个DNS服务器,NS为dns.test.com,对应的IP为1.1.1.1。那么***者伪造源IP回包的时候只需要伪造这一个IP应答给本地缓存DNS就可以了,因为本地缓存DNS肯定是向1.1.1.1发起了迭代请求。但如果有多台权威DNS,那么这个***的成功率就会降低,***的时间就会变长。因为,本地缓存DNS可能是向5.5.5.5发了www123456.test.com的域名解析请求。***者回的包可能回的是3.3.3.3,就算是伪造5.5.5.5回的包,那么可能已经在真正应答之后了。
(2)在选择DNS软件时要尽量选择DNS ”源端口随机性”较好的软件或者版本。
例如,现在应用比较广泛的开源Bind软件,在比较早期的版本中,源端口的随机性并不是很好。微软windows serve中的DNS软件做“本地缓存DNS”更是不太合适,因为无论从源端口随机性、解析性能等等诸多方面都不健壮。但它也有自身的有点,例如与AD域的配合等方面。
(3)在现有的DNS基础上绑定新的安全机制,比如部署DNSSEC或者增加新的安全认证协议。
总之,DNS安全是一个大课题,需要各方共同推动才会达到比较理想的效果。在日常的工作中最重要的是提高自身安全意识,了解目前负责的系统是否存在DNS安全隐患,及时的做好软件升级、做好网络规划等工作。