一群人 清华大学和加州大学河滨分校的研究人员开发了一种新型攻击 该 允许替换DNS服务器缓存中的错误数据, 可以用来欺骗任意域的IP地址,并将对该域的调用重定向到攻击者的服务器。
攻击绕过了对DNS服务器的增强保护 来阻止Dan Kaminsky在2008年提出的经典DNS缓存中毒方法。
卡明斯基方法 操纵DNS查询ID字段的大小可忽略不计, 只有16位要找到欺骗主机名所需的正确标识符,只需发送大约7.000个请求并模拟大约140.000个虚假响应即可。
攻击归结为发送大量伪造的IP绑定数据包 到具有不同DNS事务ID的DNS解析器。 为了防止第一个响应被缓存,在每个伪响应中都指定了一个稍微修改的域名。
防止此类攻击,DNS服务器制造商 实现了网络端口号的随机分配 从中发送解析请求的源,该请求补偿了不足的较大标识符大小(要发送虚拟响应,除了选择16位标识符之外,还必须从64 2个端口中选择一个,这增加了选项以选择32 ^ XNUMX)。
攻击 SAD DNS大大简化了端口识别 通过利用网络端口上的筛选活动。 该问题在所有操作系统中均得到体现。 (Linux,Windows,macOS和FreeBSD)以及使用不同的DNS服务器(BIND,Unbound,dnsmasq)时。
据称,所有开放式求解器中有34%被攻击, 以及经过测试的12个顶级DNS服务中的14个,包括8.8.8.8(Google),9.9.9.9(Quad9)和1.1.1.1(CloudFlare)服务,以及来自信誉良好的供应商的4个经过测试的路由器中的6个。
问题是由于ICMP响应数据包形成的特殊性, 该 允许您确定对活动网络端口的访问 而不是通过UDP使用。 此功能使您可以非常快速地扫描打开的UDP端口并基于源网络端口的随机选择有效地绕过保护,从而将暴力选项的数量从2 ^ 16减少到2 ^ 16 + 2 ^ 32。
问题的根源是限制运输强度的机制 网络堆栈上使用可预测的计数器值的ICMP数据包的数量,从此开始正向节流。 此计数器是所有流量所共有的,包括来自攻击者的虚假流量和实际流量。 默认, 在Linux上,ICMP响应被限制为每秒1000个数据包。 对于到达封闭网络端口的每个请求,网络堆栈都会将计数器加1,并从不可达端口发送带有数据的ICMP数据包。
因此,如果您将1000个数据包发送到其他网络端口, 所有这些都已关闭,服务器将限制发送ICMP响应 一秒钟,攻击者就可以确定搜索的1000个端口中没有开放的端口。 如果将数据包发送到开放端口,则服务器将不会返回ICMP响应 并且不会更改计数器值,即发送1000个数据包后,将不会达到响应速率限制。
由于伪造的数据包是从伪造的IP执行的,因此攻击者无法接收ICMP响应,但是由于有了总计数器,每1000个伪造数据包,他就可以从真实IP向不存在的端口发送请求并评估该IP地址。答案的到来; 如果答案来了,则使用1000个软件包中的一个。 攻击者每秒可以将1000个伪造的数据包发送到不同的端口,并快速确定打开的端口位于哪个块中,然后缩小选择范围并确定特定的端口。
Linux内核通过随机化参数的补丁解决了该问题 限制发送ICMP数据包的强度,这会引入噪声并最大程度地减少通过边信道泄漏的数据。
数据来源: https://www.saddns.net/