Published in: IEEE INFOCOM 2019 - IEEE Conference on Computer Communications
Author(s) :Fatemah Alharbi ; Jie Chang ; Yuchen Zhou ; Feng Qian ; Zhiyun Qian ; Nael Abu-Ghazaleh
问题描述
本文首先介绍了什么是DNS缓存投毒,即将恶意条目注入DNS解析系统,从而使攻击者可以将客户端请求的查询结果重定向到恶意服务器。攻击者通常以DNS解析器为目标以便毒害所有使用该受损解析器的计算机的DNS条目。但最近的防御措施可以有效地保护解析器,使传统DNS缓存投毒攻击失效。而本文提出一个基于客户端DNS缓存的投毒攻击,规避针对解析器的防御措施,在客户端缓存发起攻击,和旁路攻击者合作使用一种无特权的恶意软件在客户端毒害整个操作系统的DNS缓存。本文对Windows、Mac OS、Ubuntu三个操作系统都发起了攻击,行为和漏洞利用策略都不相同,并且还可以对处在NAT路由器后面的客户端进行攻击。最后本文还提出了针对本次投毒攻击的防御措施。
图解攻击
从图1可以看到攻击者试图将客户端DNS缓存中的www.bank.com的IP地址重定向到自己搭建的服务器地址。攻击成功的关键在于,当受害者发起DNS查询时,攻击者能比真实响应更快地发出具有匹配端口号、匹配TXID字段等的假DNS解析记录的恶意响应。一旦攻击成功,客户端就仅接收该恶意响应并将其缓存在自己操作系统的DNS缓存中,通常攻击者的响应会使用较大的TTL(生存时间)确保中毒值保留在缓存中。
来看一下本文设置的攻击环境
01
源端口保留
为了发送欺骗响应,旁路攻击者必须首先获取DNS请求的源UDP端口,源IP地址,目标IP地址和目标UDP端口。后三个可以通过受害机上无特权的恶意软件轻松获得,攻击的基本要素是能够预测或推断DNS请求的源UDP端口。本文发现,对允许同时打开的可用于任何程序的套接字数量而言,测试的所有操作系统都是允许的,所以攻击者用一个无特权程序保留除了某一个端口之外所有的本地端口号,这样发送DNS请求时只能选择那一个端口号。
02
缓存投毒
首先,IP地址为1.1.1.1的客户端上的恶意软件保留了除49152外的所有UDP端口;
其次,该恶意软件发出以CtoR表示的目标域名为www.bank.com的DNS查询,以源UDP端口为49152发给合法的IP地址为2.2.2.2的DNS解析器,客户端的操作系统随机选择一个TXID(例如1000);
第三,攻击者重复发送由AtoC1,AtoC2,…,AtoC65536表示的欺骗响应,每个响应都具有不同的TXID字段。如果这些响应之一包含正确的TXID(即AtoC1000),则可能使缓存中毒以存储www.bank.com的恶意IP地址。由于TXID是一个16位的字段,即使猜测的数目似乎很大,但也可能会发生蛮力攻击,尤其是考虑到该攻击可能需要在许多试验中重复进行(例如,只需发出getaddrinfo()调用);
最终,解析器响应由恶意软件发出的DNS查询,并发送由RtoC表示的真实响应。但是,由于不再存在挂起的查询,DNS系统服务将忽略该响应。否则,将缓存真实IP地址,攻击者将从第二步开始重复攻击。这些攻击步骤与攻击位于NAT之后的客户端一样,除了攻击者尝试破坏NAT的响应而不是解析器之外。
攻击策略和分析
攻击网络拓扑分为无NAT的客户端和有NAT的客户端。
01
不考虑NAT的攻击
攻击难点:具有匹配TXID的恶意响应在真实响应之前到达,在客户端和解析器之间只有一个往返时间的窗口。在此期间不成功就要等缓存记录时间超时
,再根据三种操作系统Windows、Ubuntu Linux、Mac OS分别制定攻击策略。
1)Windows:根据逆向工程DNS系统服务,系统每次调用getaddrinfo()函数做DNS解析,收到假TXID的响应包会发起5次重传然后中止,因此只要在合法响应前有5个假响应,那么后来的合法响应就不会被接受。虽然攻击者在每次调用getaddrinfo()之前只有五次机会猜测TXID,但是攻击者始终可以多次调用getaddrinfo()直到攻击成功。
2)Mac OS:Mac系统会继续接收DNS响应直到收到具有匹配TXID的响应,若超时未有任何内容则会重传继续等待正确响应。在合法响应到达之前攻击窗口只有一个往返时间。
3)Ubuntu Linux:和Mac相比,Linux系统的不同主要体现在发送DNS查询时使用源端口随机化,所以采用相同端口保留技术让DNS查询只有一个可用的端口。
02
考虑NAT的攻击
NAT通过将专用地址重新映射到其自己的IP地址并使用端口号来跟踪内部连接到外部连接的映射,从而使专用网络上的客户端连接到互联网。端口号未知增加了系统混乱程度也就提高了攻击难度。DNS会话的NAT端口转换行为取决于客户端和NAT如何配置DNS。
1)客户端和NAT都使用DHCP
2)客户端手动配置DNS
3)NAT手动配置DNS
4)客户端和NAT都手动配置DNS
针对2)、3)、4)NAT都保留源UDP端口,攻击者很容易攻击NAT背后的客户端,而对于1),通过建立大量连接保持所有外部NAT路由器的源UDP端口,只留一个强制让NAT用,让攻击者不用猜端口号。
03
性能分析
对于单个欺骗答复,对TXID进行正确猜测的概率为1/2^16(1-2^16是TXID字段范围)。响应一次getaddrinfo()的调用而导致攻击失败的概率:P(失败)=(2^16-z)/2^16,其中z是2^16次的最大猜测数。对于Windows,z为5,因为5次尝试后getaddrinfo()失败,因此每次尝试的成功率为0.0076%。对getaddrinfo()的x次调用进行的攻击的总体成功概率为:P(X≤x)= 1-P(失败)^x。成功之前的平均尝试次数由几何分布确定,并且为1/(1-P(失败))。
对于Windows,攻击尝试了13000次。由于Windows不对getaddrinfo()进行速率限制,因此每次尝试的时间可能短至2毫秒,这意味着成功的平均时间将短至2毫秒*13K = 26秒。对于Mac和Linux,z由离旁路攻击者到客户端的带宽和DNS解析的RTT(往返时间,确定何时接收到合法响应)确定。
评估
从图4可知,固定带宽,往返时间越长,攻击成功所花的时间越短;固定往返时间,带宽越大,攻击成功所花时间越短。相比Windows,对Ubuntu攻击成功所花时间更长。
从图5可知,攻击者拥有的资源越多(高往返时间、高带宽),攻击成功时间越快。
从图6可知,有DOS攻击缩短了攻击成功时间;相同带宽,往返时间越长,攻击成功时间越短;相同往返时间,带宽越大,攻击成功时间越短。
从图7可知,Windows和Ubuntu Linux的攻击成功时间除了取决于往返时间和带宽还取决于是否在网络拓扑中加入了NAT,当存在NAT时,直到攻击成功的回合数会增加,从而导致更长的成功时间。
攻击缓解
先在客户端UDP53端口上嗅探所有DNS流量,在一个DNS查询发送后,一旦发现带有大量错误TXID号的响应,即检测到攻击。
缓解策略首先针对本地恶意进程:根据用户设置或提前配置的安全策略,操作系统可以首先停止恶意进程,释放其保留的端口然后再发起相同的DNS查询。
其次针对缓存投毒有两种策略:
1.重复发起查询:因为每次攻击成功需要更大的成本,只有连续查询得到相同响应才相信;
2.反向查找验证:通过得到的DNS相应包的IP地址发送一个指针(PTR) DNS查询,检查得到的域名和本机要查询的域名是否一致。但现有网站中只有一半有PTR记录,能返回查询域名的只有四分之一,防御有运气。
一个风险高干扰少的建议:当接收到正确TXID号的DNS响应时不立刻缓存,等到验证之后或者是确保它没有缓存中毒并且没有犯规行为时再使用。
关于 天 方 夜 “谈”
天方夜谈原意讲不切实际的东西,而这里想要 “脚踏实地”真正弄懂并感受一篇文章的思想。
方班人有自己的浪漫,
我们探讨知识,谈论理想,
采摘科研的繁星,
脚下是星辰大海。
天:代表我们的理想犹如天空般浩荡
方:代表方班
夜:代表代码人的冷静与静谧
谈:代表方班愿与您,就领域内的经典思想和前沿成果“秉烛夜谈”