由于Linux弱点,DNS缓存中毒攻击再次出现

清华大学和加利福尼亚大学的研究人员已经确定了一种可用于进行DNS缓存中毒攻击的新方法。

新发现重现了2008年的错误,该错误曾经被认为已经永久解决。

什么是DNS欺骗或缓存中毒?

最好将域名系统(DNS)理解为互联网的电话簿。

很像,当您想给朋友A打电话时 , 您需要通过一个称为电话簿的系统查找他们的电话号码。

同样,当您浏览到域时,您的Web浏览器会尝试通过称为DNS的Internet目录系统查找其IP地址。

实际过程需要一系列步骤,而且并不总是那么简单。

例如,如果您或您网络中的某个人以前访问过 bleepingcomputer.com,则我们的IP地址将被缓存在您计算机上或中间服务器上的某个位置。

这意味着下次您访问 bleepingcomputer.com时, 将不需要再次进行DNS查找。您的计算机或网络浏览器已经知道在哪里找到我们。

DNS缓存中毒攻击是指污染中间服务器上现有的此缓存。

想象一下,如果您的计算机(客户端)的DNS缓存一直依赖于查找 bleepingcomputer.com的IP,是否向您返回了错误的IP地址而不是我们的IP地址?

如果攻击者能够破坏DNS缓存,它们可能会对互联网造成严重破坏。

dns欺骗
说明了DNS欺骗或缓存中毒攻击
来源:Bluecat

安全研究员Dan Kaminsky于2008年发现了此类漏洞。 

当设备使用DNS查找域名的IP地址时,它会在对DNS服务器的请求中包含唯一的“交易ID”号。

当服务器用应答响应设备时(例如。bleepingcomputer.com网站在104.20.60.209)中可以找到,只有当它还包含原始事务ID时,设备才会将响应视为有效。

原因很简单:防止恶意DNS服务器用恶意的无效DNS条目淹没您的设备。

如果没有进行这些检查,那么恶意的DNS服务器可以轻松地为用户提供欺骗性的IP地址,并且当连接到网站时,由于恶意欺骗的DNS响应,用户现在将重定向到攻击者的服务器,而不是合法的服务器。 DNS响应。

但是,卡明斯基发现只有65,536个可能的交易ID。

因此,攻击者可能会发送ID为0到65,535的多个伪造的DNS响应,并同时阻止对第一个响应进行缓存。

为了防止缓存第一个DNS响应,攻击者将发送具有轻微域变化的响应,例如每个响应都包含一个不同的子域:  1.bleepingcomputer.com,2.bleepingcomputer.com等。 

最终,攻击者将能够猜测DNS请求的正确交易ID,并同时通过DNS响应提供其恶意服务器IP。

下次,用户访问 bleepingcomputer.com时,如果此类攻击成功,则该域将解析为攻击者的服务器。

DNS缓存中毒如何返回?

为防止DNS缓存中毒攻击,已实现了源端口随机化。

这意味着,即使作为攻击者,即使我最终可以猜出您的设备在DNS请求中指定的65,536个事务ID之一,我也不知道将DNS响应发送到哪里-因为现在您的设备正在进行DNS查找因此是从随机端口(理论上也有65,536个值)而不是端口53中获取。

鉴于存在数十亿种可能性,该解决方案几乎不可能通过Kaminsky的发现方法来进行DNS缓存中毒攻击。

但是清华大学和加利福尼亚大学的研究人员发表了一种利用侧信道攻击来推断DNS客户端的源端口号的方法。

有了源端口,您就可以再次通过猜测事务ID来进行Kaminsky的DNS缓存中毒攻击。

由于Linux内核如何处理ICMP 请求(考虑 pingtracert),猜测源端口成为可能。

为了节省带宽,Linux内置的速率限制器将传入请求的数量默认设置为每秒1,000个,并使用计数器来跟踪这些请求。

对于在基于Linux的服务器上的封闭端口上收到的每个请求,计数器将减1  并且服务器将以“无法访问”进行响应。

意思是,在一秒钟内,如果您将1000个数据包发送到服务器上不同的随机端口上,而这些端口均已关闭,则服务器将在一秒钟内切断您的访问。

但是,这也将告诉您,您可能要打开的所有1000个猜测都是不正确的。 

有趣的是,对于在有效的开放端口处收到的每个请求,计数器都不会递减。而且,服务器显然不会发送“ unreachable”。

这意味着,每一 ,攻击者可能会淹没与去往随机端口1000级欺骗性的数据包DNS解析器。

这样,攻击者只需几秒钟即可推断出DNS解析器上所有试图毒害的端口均已打开。

有了正确的端口知识,他们便可以重新利用Kaminsky的漏洞来引起DNS中毒攻击。

那么有解决办法吗?

就像源端口随机化为攻击者增加了一些复杂性一样,Linux内核将速率限制器的最大值随机化,而不是始终使用1000,可能会很有用。

这样的修复将使攻击者再次难以推断出正确的端口以进行DNS欺骗攻击。

BlueCat的软件安全总监David Maxwell提出了一个建议:

“ Linux引入的用于自动随机化速率限制值的更改已包含在10月16日的Linux内核中,这意味着要花很多时间才能运行大多数系统。该版本尚未发布。与此同时,您可以使用一个小的shell脚本来不断改变ICMP速率限制。虽然不像内置在内核中那样干净,但是是可行的解决方法。” 因此,我们正在努力向社区提供这样的示例脚本。”

现在,对Linux内核的icmp.c文件进行的修复为计数器分配了一个随机值(称为“贷方”),但是正如Maxwell所言 ,全球范围内的Linux服务器可能还需要一段时间才能赶上。

icmp修复速率限制器2020
对Linux内核的ICMP速率限制器进行的修复

Maxwell建议不要完全阻止ICMP流量,因为该协议具有合法的用例,例如IPv6分段。

麦克斯韦表示:“如果DNS服务器完全阻止了ICMP,如果它与另一台服务器之间的跃点具有较小的MTU(阻止ICMP导致PMTUD黑洞),则区域传输可能会失败。”

这种旁道攻击的发现给Internet工程师施加了更大的压力,以提高DNS安全性。

DNS已经是一种相对不安全的协议,旨在提高速度而不是性能和安全性。

甚至即使通过HTTP-over-HTTPS(DoH)之类的增强功能也无法阻止攻击者滥用DNS 进行其恶意活动。

*编译:Domino

*来自:bleepingcomputer