近来,网络上出现史上最强大的互联网漏洞——DNS缓存漏洞,此漏洞直指我们应用中互联网脆弱的安全系统,而安全性差的根源在于设计缺陷。利用该漏洞轻则可以让用户无法打开网页,重则是网络钓鱼和金融诈骗,给受害者造成巨大损失。

  缓存中毒攻击者(cache poisoning)给DNS服务器注入非法网络域名地址,如果服务器接受这个非法地址,那说明其缓存就被攻击了,而且以后响应的域名请求将会受黑客所控。当这些非法地址进入服务器缓存,用户的浏览器或者邮件服务器就会自动跳转到DNS指定的地址。

这种攻击往往被归类为域欺骗攻击(pharming attack),由此它会导致出现很多严重问题。首先,用户往往会以为登陆的是自己熟悉的网站,而它们却并不是。与钓鱼攻击采用非法URL不同的是,这种攻击使用的是合法的URL地址。

一、DNS缓存中毒攻击原理
  首先来了解一下DNS的工作过程。DNS被设计成C/S应用程序,需要把地址映射为名字或把名字映射为地址的主机调用DNS解析程序,向最近的DNS服务器发出查询请求,此时,DNS服务器可以有两种方式来响应客户的请求,一种叫递归解析,另一种叫迭代解析。DNS缓存中毒攻击主要是针对递归解析方式工作并缓存非本域的解析结果的DNS服务器。下面就主要分析递归解析过程。
  (1)应用程序需要解析一个域名时,本机会发起域名解析请求,解析程序会向首选DNS服务器DNS-A发起域名解析请求;
  (2)DNS-A收到解析请求后会去查询自己的管辖域,如果请求的是自己管辖域的域名就会直接将查询结果返回给解析程序,如果不在DNS-A的管辖域内,DNS-A就向它的上级服务器DNS-B发起解析请求,等待DNS-B的查询结果;
  (3)如果DNS-B解析不了,就会告诉DNS-A,我解析不了,DNS-C可能会知道;
  (4)DNS-A就会给DNS-C发出解析请求,等到DNS-C的查询结果;
  DNS服务器不是对收到的任何DNS响应数据包都会接受,它会解码数据包,检查数据包是否符合接受的标准,那DNS服务器会检查数据包中的哪些数据来判断该数据包是不是它所希望的包呢?
  1、在DNS服务器发出的查询请求包中包含了它的UDP端口号,返回的响应数据包的目的端口号不对,网络协议栈就会直接丢弃该数据包。
  2、DNS服务器收到响应数据包后,可以通过检查问题域与发出的查询包中的问题域是否一致来判断响应数据包的合法性。
  3、DNS服务器每发出一个查询请求都会分配对应的一个查询ID号,在内部对应是某一个域名查询请求,在DNS服务器内部区分不同的查询就是TID号,如果DNS服务器收到的响应数据包中的TID号不在DNS服务器等待响应数据的TID中,服务器就会丢弃该数据包。
  4、响应数据包中的授权域和附加域
  授权域和附加域中的域名必须和问题域中的域名是同属于某个域名下的子域名。
  如果上述所有条件都满足了,DNS域名服务器就会确定该响应数据包是对它发出的某个查询请求的响应,接受使用相应数据包中的数据,并缓存结果。
  如果某个攻击者可以预测和伪造响应数据包,他就可以对DNS服务器发起缓存中毒攻击了。由于DNS服务器发送的数据包中的TID只有16位,而且大部分的DNS实现发出的请求中的源端口都是固定不变的。因此,攻击者就可以伪造DNS响应包,DNS服务器在收到响应包后就会将解析结果保存在自己的缓存中,进而实现了缓存中毒攻击。
二、DNS缓存中毒的防护
  及时检查自己的DNS服务器是否存在DNS缓存中毒漏洞,如果发现了自己的DNS服务器存在该漏洞就可以在被攻击前采取措施修补,避免攻击事件的发生。
  目前检查DNS服务器是否存在缓存中毒漏洞的主要方法是模拟攻击过程中的一部分。检查的具体过程是首先需要搭建一个自己可以控制的DNS服务器,与扫描器协同工作,让扫描器向要检查的DNS服务器查询只有控制的DNS服务器才能解析的域名请求,被检查的DNS服务器需要解析该域名就会向别的DNS服务器请求解析,根据前边介绍的DNS服务器解析原理,最终被检查的服务器发出的查询请求可以被导向到我们控制的DNS服务器,这样,控制的服务器就可收到检查服务器的请求,进而可以收集到检查服务器发出请求包的特征,被控服务器就可以将收集到的特征信息作为查询的响应数据返回给检查的DNS服务器,进而可以返回给扫描器,这样扫描器就可以根据收集的特征来判断检查的DNS服务器是否存在缓存中毒漏洞。
  技术层面的防护措施有如下方法:
  UDP源端口随机化选择是一种比较有用的防护举措,不应该再是默认的53,而是应该在UDP端口范围内随机选择,使得投毒命中的概率极大的降低。
  加密所有对外的数据流,对服务器来说就是尽量使用SSH之类的有加密支持的协议,对一般用户应该用PGP之类的软件加密所有发到网络上的数据。
  禁用DNS缓存,在注册表中找到对应的键值,进行修改并保存。
  及时刷新DNS,DNS缓存会被重建,再次用域名访问IP服务器,故障消失。
  修改IP协议包中的TTL值可以有效防止缓存中毒,但较小的TTL值会增加服务器的负担,应根据服务器的性能和网络情况合理地选择。
  采用域名系统安全协议(DNSSEC)机制,依靠公钥技术对于包含在DNS中的信息创建密码签名。
三、总结
  去年发生了几次大规模的DNS攻击事件,充分暴露了DNS协议的安全隐患,我们也知道DNSSEC有着强大的优越性,虽然DNSSEC还不能完全解决DNS安全问题,但是我们有理由相信有了不断完善的DNSSEC技术,DNS安全问题将有望获得全面解决。

DNS缓存中毒攻击与防护相关推荐

  1. DNS安全 DNS缓存投毒与防护

    http://blog.51cto.com/zdzhu/1575498 http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Networking/DNS_Remo ...

  2. DNS安全(一)DNS缓存投毒与防护

    互联网的飞速发展,把人们带入了一个新的时代.一方面,人们享受着互联网带来的便捷多彩的生活,另一方面,个人信息安全也正面临者新的挑战. 如今的互联网,时时刻刻都在发生网络***.病毒传播.一边是攻,另一 ...

  3. @cacheable 是否缓存成功_DNS缓存中毒攻击

    什么是DNS缓存中毒 DNS缓存中毒是一种网络攻击,它使您的计算机误以为它会到达正确的地址,但事实并非如此.攻击者使用DNS缓存中毒来劫持互联网流量并窃取用户凭据或个人数据.DNS缓存中毒攻击也称为D ...

  4. 远程DNS缓存攻击__网络攻防实验三

    一.实验描述 DNS(Domain Name System)是一个多层次的分布式数据库系统,其基本功能是完成域名解析,即提供域名和IP 地址之间的映射关系,为Internet 用户提供便利.DNS 服 ...

  5. DNS 缓存授权服务器攻击简介

    DNS架构 当用户上网访问某个网站时,会向DNS缓存服务器发出该网站的域名,以请求其IP地址.当DNS缓存服务器查找不到该域名与IP地址对应关系时,它会向授权DNS服务器发出域名查询请求.为了减少In ...

  6. linux mint 修改dns,如何在Ubuntu和LinuxMint中刷新DNS缓存

    本篇文章给大家介绍的内容是关于如何在Ubuntu和LinuxMint中刷新DNS缓存,下面我们来看具体的内容. 域名系统(DNS)是互联网的主干网之一.你无法想象在全球数百万用户的公共网络上运行网站. ...

  7. ubuntu 14.04 64 bit上开启nscd服务缓存加速及清除dns缓存

    简介 linux本身是没有dns缓存的,想使用dns缓存的话需要自己安装一个服务程序NSCD(name service cache daemon).  Nscd会缓存libc接口(比如 getpwna ...

  8. 如何清空DNS缓存Windowslinux

    一.Linux下清空DNS缓存 Linux下DNS缓存实现通常有两种方式: 一种是用DNS缓存程序NSCD(name service cache daemon)负责管理DNS缓存. 一种实现DNS缓存 ...

  9. Linux在shell终端中清空DNS缓存,刷新DNS的方法(ubuntu,debian)

    前言 在Linux系统里查询DNS使用如下命令 dig baidu.com @114.114.114.114 或者使用系统默认的DNS服务器查询 nslookup baidu.com 下文中的方法不一 ...

最新文章

  1. Notepad++使用技法
  2. 一步步实现一个基本的缓存模块
  3. Python 中使用 for、while 循环打印杨辉三角练习(列表索引练习)。
  4. pandas基础(part1)--Series
  5. [转]RxHttp 一条链发送请求,新一代Http请求神器(一)
  6. C语言中比较大小的函数模板,C语言中实现模板函数小结 : 不敢流泪
  7. 大牛带你直击优秀开源框架灵魂,给大家安排上!
  8. cmd命令操作Oracle数据库
  9. date设置时间_解决 IDEA 无法找到 java.util.Date 的问题
  10. java修改另存excel_Word文档导入Excel总变形,调整格式你花了1小时,同事三步就搞定...
  11. eclipse怎么运行不了服务器,eclipse可以运行,部署服务器启动不起来
  12. ASP.NET 4.0尚未在Web服务器上注册。您需要手动将Web服务器配置为使用ASP.NET,这样您的网站才能正确运行。...
  13. 全志平台BSP裁剪(2)附件一 General setup配置说明
  14. 为什么Qt编程出现No signal?
  15. opencv 图片降噪
  16. Try{}里有一个return语句,那么紧跟在这个try后面的finally{}里的code会不会执行,什么时候执行,在return之前还是之后?
  17. 在plsql中强行杀掉执行的sql或存储过程
  18. 企业网盘应用,加速上海交大信息化校园建设
  19. java题库(java题库及答案简答题)
  20. SQL查询日期和时间

热门文章

  1. 软考高级软件架构师学习笔记一(软件架构设计)
  2. 关于motionevent的使用
  3. “转载” 融云IM商用版冰点促销 助程序员的十二时辰躺赢
  4. 优化器介绍—SGD、Adam、Adagrad
  5. lua 16进制转10 10转16进制
  6. ZEMAX像质评价及六种像差汇总
  7. 线性表 (一) 线性表定义与线性表插入与删除
  8. Python Environment Interpreter
  9. uniapp小程序开发自定义相机、拍照、上传
  10. 什么是人工智能?什么是机器学习?什么是深度学习?三连问