Cross Layer Attacks and How to Use Them

  • A+
所属分类:安全文章

Cross Layer Attacks and How to Use Them

原文作者:Amit Klein 

原文标题:Cross Layer Attacks and How to Use Them (for DNS Cache Poisoning, Device Tracking and More) 

原文链接:https://www.researchgate.net/publication/347125379_Cross_Layer_Attacks_and_How_to_Use_Them_for_DNS_Cache_Poisoning_Device_Tracking_and_More 

原文来源:IEEE Symposium on Security and Privacy(简称 S&P) 

笔记作者:CJRTnT

摘要

本文分析了Linux和Android中所使用的PRNG(pseudo random number generator,即伪随机数生成器,用于生成UDP源端口号IPv6中的流标签值IPv4中的ID号),证明其是有弱点的。

通过利用这样的弱点可以:

1.实现跨层攻击(cross layer attack)

2.实现DNS缓存下毒攻击

3.识别出Linux和Android设备

介绍

A. DNS和DNS缓存下毒

存根解析器(stub resolver)是一种系统服务,用于发送DNS查询并接收应答,例如调用系统API中的getaddrinfo()就会将查询请求委托给stub resolver。在这样的DNS查询-应答过程中,stub resolver和递归过程中的DNS解析器都会缓存DNS应答,如下图所示,注意区分下图的[][][存根解析器]、[递归解析器]和[权威DNS服务器]。

Cross Layer Attacks and How to Use Them

DNS使用的是UDP协议,为了伪造DNS应答,传输层上:需要攻击者知道UDP报文头部的所有参数,即源IP目的IP源端口号目的端口号,不过源IP、目的IP是可以确定的,且源端口号也是固定的53,可见只需要猜测16位的***目的端口号***(实际上只有15位的熵);应用层上:即DNS层,需要攻击者猜测16位的***TXID***(transaction ID DNS header field)。可见,总共需要猜测31bits来实现DNS缓存下毒。虽然可以伪造并发送2^31个DNS应答报文,但是还是需要一种更高效的方法。

B. 设备追踪

当前已有的基于浏览器、基于web的设备追踪(browser-based tracking,web-based tracking)主要是用于广告推送。

C. 本文提出的方法

  1. DNS缓存下毒的实现

    首先与目标设备建立TCP/IPv6连接以分析其PRNG(每个CPU逻辑核都有一个PRNG实例),并通过观察IPv6中的流标签值提取出该PRNG的内部状态。接下来强迫目标设备发送DNS查询,然后向该目标设备发送大量伪造的DNS应答报文(遍历所有TXID值并利用提取出的PRNG状态预测出UDP端口号),该报文携带随机的DNS记录,尽管生成IPV6流标签值的PRNG可能与生成UDP端口号的PRNG不是同一个,但是事实证明这样的方式可以成功实施DNS缓存下毒攻击。

  2. 设备追踪的实现

    使用HTML snippet强迫某设备上的浏览器发送TCP/IPv6、UDP或者TCP/IPv4流量至我们的网站,通过建立这样的TCP/UDP连接让我们收集到大量TCP/IPv6流标签值、UDP源端口号以及TCP/IPv4 ID号,这样便能重构出该设备PRNG的内部状态,由于一个设备可能会有多个CPU逻辑核(便会有多个PRNG实例),因此我们尽可能收集该设备的所有PRNG内部状态,将收集到的内容存入记录,这便可以识别出一个设备。

D. 本文所提出方法的优点

我们所提出的DNS缓存下毒攻击速度非常快(比暴力破解快3000-6000倍);该方法可以远程实施,不需要在目标设备上安装恶意软件;该方法不依赖于IPv4分片。

我们所提出的设备追踪方法可以跨浏览器、跨浏览器的隐私模式、跨不同网络(包括IPv4、IPv6和VPN);该方法可以持久追踪一个设备;缺点在于,该方法需要让浏览器停留在我们的网站上的时间较长才能进行追踪。

E. 本文的贡献

  1. 分析了Linux的PRNG并指出其弱点。
  2. 利用该弱点进行DNS缓存下毒攻击。
  3. 利用该弱点对Linux和Android设备进行追踪,且是一种跨层攻击(网络层和传输层),可利用的协议字段如下图所示:

Cross Layer Attacks and How to Use Them

(备注:跨层攻击是指利用多个网络协议层的漏洞对目标系统进行攻击,或者利用某些网络协议层的漏洞对其他层的协议进行攻击)

Linux内核中的RRNG

PRNG的核心状态包括四个线性反馈移位寄存器(LFSRs),记为S1-S4,其长度分别为31、29、28和25位,共113 bits;PRNG的输出值=S1⊕S2⊕S3⊕S4。

对PRNG的分析

这一部分涉及到了很多线性代数等的数学知识,读的不是特别懂;总的来说,就是通过从目标设备获得的大量IPv6流标签值、IPv4的ID号和UDP源端口号来解线性方程,以提取出该设备的PRNG状态。

Linux下的DNS缓存下毒

A. 攻击record-based DNS存根解析器

存根解析器的缓存方式要么是基于记录(record-based)的要么是基于查询(query-based)的。基于记录的缓存方式将DNS应答中的记录提取出来并存入数据库中;基于查询的缓存方式将DNS查询所对应的DNS应答缓存下来,只有在完全相同的DNS查询时才会进行参考。

我们所提出的DNS缓存下毒攻击针对基于记录的缓存方式表现最好,也可以攻击基于查询的缓存方式,但是效率和覆盖范围相对较低。该攻击不适用于不将UDP源端口选择交由操作系统处理的存根解析器,例如Android的存根解析器。攻击过程如下图所示(结合再下一张图一起理解):

Cross Layer Attacks and How to Use Them

成功攻击stub resolver的条件:攻击者正确猜测出了递归解析器的IP地址(通常有1-2个IP地址);用于生成DNS查询源端口的PRNG核心与在之前生成UDP源端口号或TCP/IPv6流标签值的PRNG核心(也就是攻击者提取出的PRNG核心)相同;攻击者猜测出了正确TXID值,且伪造的DNS应答比来自递归解析器的真实应答更快到达目标。

如果攻击者可以让权威DNS服务器(已被攻击者控制)拒绝响应任何查询请求,便可以大大增加存根解析器接受伪造的DNS应答的机会。

在上述基础上,还增加了“后DNS”探测,即向目标设备发送一个TCP SYN报文。这样一来,目标设备的DNS查询请求就被夹在“前DNS”探测和“后DNS”探测之间。当“后DNS”探测的响应报文到达时,便可以将其流标签值与“前DNS”探测的PRNG状态相匹配,如果匹配成功,这证明很可能也与DNS查询的UDP端口相匹配,便说明是相同的PRNG状态(即:目标设备的相关进程还在同一个CPU逻辑核上运行),只有这样的条件下才进行攻击。通过这样的方法,便能节省攻击时间和减少发送数据包的数量。

假如目标机器是一个SMTP服务器,对其进行的攻击流程如下图所示(结合上一张图一起理解),蓝色部分用于强迫目标发送DNS查询,绿色部分用于获取目标的PRNG状态,红色部分是DNS查询和伪造+真实的DNS应答(由于需要进行解析的域名是由攻击者所控制的,攻击者控制其不响应DNS查询,因此在⑭中返回的是SERVFAIL)。

Cross Layer Attacks and How to Use Them

1-3:攻击者机器建立一个到目标机器的TCP连接(SMTP端口)

4-7:攻击者发送SMTP HELO、MAIL FROM、RCPT TO和DATA命令,其间有几毫秒的延迟,但不等待目标的响应

8:攻击者从不同的源端口向目标机器发送8个TCP SYN数据包,它们之间也有几毫秒的延迟,也不等待目标的响应

9:攻击者发送SMTP消息数据(包括DKIM头),紧跟着End-of-Message标记

10:强迫目标机器向递归解析器发出对攻击者域的DNS查询。递归解析器最终将该查询转发给攻击者的权威服务器(图中未显示)

11:攻击者等待几毫秒,然后发送1个TCP SYN数据包

12:攻击者现在等待其所发送的所有数据包的响应。分析前8个SYN+ACK数据包的流标签值以提取出PRNG核心状态,然后计算出最后一个SYN+ACK中PRNG流标签值的偏移量

13:假设攻击者能够预测一个UDP源端口,便以尽可能快的速度发送尽可能多的伪造的DNS应答

14:递归解析器没有从攻击者所控制的权威服务器收到任何应答,并且超时

B. IP源地址欺骗

DNS缓存下毒攻击中,发送伪造源IP地址(伪造为DNS递归查询过程中的解析服务器地址)的数据包是十分关键的。

对于攻击方的网络,一些ISP在其客户网络上使用过滤或NAT,使得源自客户网络之外的伪造数据包被丢弃或修改以保留真正的源IP地址,因此需要选择未使用过滤机制的网络以保证攻击的成功性。

对于目标网络,一部分网络通过采用入口过滤(也称为源地址验证——SAV)以识别出伪造源地址的数据包,如果目标网络的DNS服务是由ISP提供的,那么便有可能使用这样的过滤方法使得攻击无法成功;但是对于使用公共DNS服务的网络便很难防止这样的攻击。我们经过测试,估计24%-37%的主机使用的是公共DNS服务(比如将8.8.8.8作为递归解析器)。

C. UDP源端口保留

为了使我们的UDP源端口预测技术有效,由目标机器的内核生成的DNS查询中的UDP源端口必须在它离开目标网络前往递归解析器的途中被保留。由于NAT/CGNAT的存在,这一点是十分重要的。根据综合研究,部分ISP和网络是会保留端口的。此外,由于IPv6网络很少使用NAT,因此在UDP/IPv6上很少存在这样的问题。

D. 重要观察结果

(1) Ubuntu从16.10版本始使用系统解析,将UDP源端口的选择委托给底层操作系统(Linux),且使用的是基于记录的缓存方式。根据实验发现,其解析方式不会对DNS应答内容本身执行任何合理性检查,并且会盲目缓存在那里找到的DNS记录,即使它们与查询完全无关。此外,如果配置了多个DNS解析器(如8.8.8.8和8.8.4.4),攻击会难以实施。

(2) 如果递归解析器的timeout短于存根解析器的timeout,将会限制攻击者发送伪造的DNS应答的数量。

(3) 我们在Exim上进行了实验,Exim是57%的SMTP服务器所使用的服务器软件。事实上我们的攻击方法不仅限于Exim,可能还适用于任何SMTP服务器,甚至可能适用于任何服务器,只要进行必要的修改,这些服务器就可以被迫向攻击者控制的域发出DNS查询。

Android和Linux设备追踪

A. 攻击原理

设备追踪是基于可以嵌入至任意网站的HTML片段而实现的,这样的HTML片段强迫浏览器向攻击者所控制的IP地址发送TCP/IPv6(最近版本的内核中也可以是TCP/IPv4)、UDP/IPv6或UDP/IPv4数据包。

B. 攻击描述

可以让目标设备使用例如WebRTC STUN requests来向某IP地址(该IP地址所对应的主机由攻击者所控制)发送多个UDP数据包,每个STUN的目标端口不同,这样便可以收集到排列好的源端口号,以重构出生成UDP源端口号的PRNG的核心状态。由于多核设备很常见,因此需要重复上述步骤多次,这样便为追踪八核设备提供了可能(目前安卓智能手机最多只有8个核)。

C. 对IP地址的选择

不同的HTML片段可以使用不同的IP地址,同一HTML片段也可以使用多个IP地址,这能使得我们的攻击方式难以被检测到。

实验和结果

A. DNS递归解析器的timeout实验

下表展示了一些DNS递归服务器的timeout值。

Cross Layer Attacks and How to Use Them

B. 计算DNS查询中UDP端口的偏移量(offset)

这一部分主要涉及的是数学内容,计算出DNS查询报文中源端口生成点在提取出的PRNG核心状态中的偏移量。

C. DNS缓存下毒

实验结果如下图所示:

Cross Layer Attacks and How to Use Them

D. 利用UDP/IPv4源端口的设备追踪

我们建立了一个演示网站,使用HTML片段和JS代码实现。在对41个IPv4网络(包括机场、酒店等WiFi网络,蜂窝网络等)进行测试后,其中24个网络可以通过我们的方法成功提取出PRNG核心状态。

在对36个landline networks进行测试后,其中23个保留了UDP源端口(例如AT&T、Azure等)。

此外,我们的方法可以追踪到使用Express VPN的设备;另外,尽管浏览器处于Chrome的无痕模式依然不会对追踪技术造成影响。

总结

对Linux内核中的prandom PRNG进行分析找到了它的弱点:

  1. PRNG是可预测的(因为是线性的)
  2. PRNG仅是部分re-seed
  3. 所有的PRNG“使用者”共用一个PRNG实例集
  4. 不同的OSI层都会使用PRNG,因此可以使用从某一层协议提取出的PRNG来利用到另一层的协议,此为“跨层攻击”——例如我们的DNS缓存下毒方法就是从IPv4/IPv6到UDP

总结而言,本文实现了一种DNS缓存下毒攻击方法(极大减少了攻击时间)和针对Linux和Android的设备追踪方法。

安全学术圈招募队友-ing, 有兴趣加入学术圈的请联系secdr#qq.com

Cross Layer Attacks and How to Use Them

本文始发于微信公众号(安全学术圈):Cross Layer Attacks and How to Use Them

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: