文章首发自先知社区:https://xz.aliyun.com/news/17236
一、 PKES 系统 (Passive Keyless Entry and Start) 简介
PKES 是质询优先系统。什么意思呢?即汽车会主动发出质询,并寻找钥匙答复的这么一种解决方案。如果钥匙在汽车发出的信号覆盖范围内,并且收到信息当中的特定模式,它就会回复汽车的消息。汽车通过 LF(125HZ)发送质询,因此汽车可以接收到的距离只有几英尺
如图所示,这个过程可能会有两种配置方案
a)在一个典型的实现中,汽车周期性地用短信标探测通道是否存在钥匙。如果钥匙在范围内,汽车和钥匙之间的质询响应协议遵循授予或拒绝访问。鉴于密钥检测依赖于非常短的信标,这是低功耗的
b)在第二种实现中,汽车定期使用包含汽车标识符的较大质询信标直接探测通道。如果密钥在范围内,则直接响应质询。
二、中继攻击原理
中继攻击的目标是即使钥匙卡不在低频信号的覆盖范围内,也能操纵汽车。我们通过在汽车和钥匙链之间设置一个继电器来实现这个目标。攻击的总体概述可能看起来像这样:在这段描述当中,中继器由2个黑客与他们的能够接收和传输低频和高频信号射频设备组成。黑客 1收到汽车的质询,并将其转发给黑客 2。黑客 2向钥匙链发出信号。钥匙检查模式并回答问题的解决方案。黑客2捕获这个解决方案并将其传递给黑客1。然后黑客1对汽车播放信号。中继成功
:::info
中继攻击很难检测和阻止,因为它们破坏了协议中可能采用的所有传统加密机制:C只转发消息,而不需要破坏所使用的加密。这在非接触式应用程序的情况下更为严重:用户A只需将令牌(例如卡片或电话)带到读取器B的范围内,协议就会自动启动,无需获得特权的人的同意或输入。因此,可以不受阻碍地进行中继攻击。
:::
三、深入研究 PKES 系统原理
这里对 PKES 系统更进一步的进行研究。PKES 系统的作用是当携带钥匙的用户接近车辆时候自动解锁车辆。当用户远离车辆时,汽车自动锁定。这也是这一系统被称为 Passive 的原因,因为它不需要用户进行任何操作。钥匙与汽车之间的通信以磁耦合射频信号为特征。**在这个系统中,当钥匙“在汽车的通信范围内”时,汽车就会得出结论,认为钥匙离汽车很近。**PKES车钥匙使用LF RFID标签,提供短距离通信(主动在1-2米内,被动模式在几厘米内),并使用成熟的UHF收发器进行远距离通信(在10到10米内)LF通道用于检测钥匙扣是否在车内和车外区域内。图2(b)显示了为了安全方便地使用PKES系统,必须检测汽车附近的区域。区域如下:
- 与汽车的远程距离(通常可达100米)。只有通过按钥匙链上的按钮才能打开/关闭汽车。
- 在车外,但与门把手保持大约1 - 2米的距离。可以用门把手开/关汽车。
- 车内。允许启动发动机。
PKES协议因制造商而异。通常支持两种操作模式,即正常模式和备份模式。正常模式依赖于充电和工作的电池,而备用模式不需要电池(例如,当电池耗尽时)。表2总结了两种模式的位置和授权。
图1显示了在正常模式下打开汽车的两个示例实现。汽车定期或当门把手被操作时在LF频道发送信标。这些信标可以是短的唤醒消息,也可以是包含汽车标识符的较大的质询消息。当密钥检测到LF通道上的信号时,它唤醒微控制器,解调信号并解释它。在计算对挑战的响应后,密钥在UHF信道上进行应答。当密钥检测到LF通道上的信号时,它唤醒微控制器,解调信号并解释它。在计算对质询的响应后,密钥在UHF信道上进行应答。当密钥检测到LF通道上的信号时,它唤醒微控制器,解调信号并解释它。在计算对质询的响应后,密钥在UHF信道上进行应答。汽车已收到并验证了此响应。在有有效响应的情况下,汽车会打开车门。随后,为了启动汽车发动机,钥匙必须出现在汽车内(图2(b)中的内部区域)。在这个区域,钥匙接收不同类型的信息,当回复时,将通知汽车正确的钥匙在汽车内部。然后,汽车将允许启动引擎。需要注意的是,在正常模式下,LF通道只用于从汽车与钥匙通信,因为这样种操作需要大量的能量.
在备用模式下,例如,当电池耗尽时,用户仍然可以打开并启动他的汽车.制造商通常会在钥匙芯中嵌入一个备用的物理钥匙,以打开车门。这些都如图2(a).所示为了启动发动机,系统使用钥匙的被动LF RFID功能。如前面讨论的,由于非常短的通信范围,用户需要将钥匙放置在汽车中某个预定义的位置附近(例如,汽车启动按钮)。
四、针对 PKES 系统的中继攻击
在上述对于 PKES 系统的研究当中可以发现一点,PKES 系统验证成功只能够打开和启动汽车。**它并不会验证正确的信息是否在物理层面真的进行接近**。它只会认为有信号发送就认为用户已经接近了。在现实攻防当中,这并不能被认为物理接近的证明。中继攻击并不需要对信号进行解读,也不需要修改信号。只需要接收到完整的信号,接着通过中继器将信号发送到位于目标车辆旁边的设备即可。由于时代发展,PKES 系统也经过了很多种迭代。最基础的 PKES 系统其实本质上是在 RKE 系统上加入了被动的部分。在 125khz/13.52mhz 频段下检测到了信号后发送 315mhz/415mhz 的信息去解锁车门。还有一种就是现代汽车,利用蓝牙或者 NFC 实现被动检测。这两种中继方案的攻击方式是不一样的。为了方便称呼我们将前者命名为射频中继,后者命名为近场中继
五、关于可实现中继攻击的研究方案
根据如上解析,设计一个中继器有两点最基础的要求。- 首先能够完整的读取并保存钥匙发出的 LF 信号
- 能够把 LF 信号完整的传输到另一段设备上
第一套方案:空中中继攻击
攻击通过一个专门建立的射频链路传递来自汽车的低频信号,以最小的延迟。该链路由发射器和接收器两部分组成。发射器捕获低频信号,并将其上转换为2.5 GHz。获得的2.5 GHz信号然后被放大并通过空气传输。链路的接收部分接收该信号并将其下转换以获得原始低频信号。然后这个LF信号会被再次放大,并发送到一个回路LF天线,该天线会再现汽车发出的完整信号。打开和启动汽车发动机的程序与上述步骤相同。使用模拟上下转换的概念,攻击者可以达到更大的传输/接收中继距离,同时保持攻击的大小、功耗和价格都很低。
第二套方案
使用一些现有的硬件来搭建中继器设备。我们需要一个读卡器和假的 RFID 标签。但是存在一些问题:调制和解调会很大程度增加攻击响应时间,这就导致中继攻击有可能因为响应时间太长而被发现。第二,由于这种攻击方案会涉及到信号的调制和解调。如果无法找到信号的正确调制方式和解调方式会导致失败。
射频中继攻击硬件方案的研究实现
引用自独角兽安全团队的研究首先是整套方案的流程
在触摸汽车把手的时候会发出一个 125khz 的信号,来唤醒遥控。设计的设备可以在解调低频信号后接收信号,通过解调后再用 cc1101 发送出去给模块 b。模块 b 再通过这个接收到的信号使用 EM4095 给钥匙传输信号,那么钥匙在接收到信号后会发送一个 315mhz 的信号,这时候模块 b 再接收这个 315mhz 信号后给模块 A 发送信号,模块 A 传输 315mhz 信号给车。完成攻击
硬件设计方案
在例子当中的模块 A 和模块 B 是两个不同的设备
模块 A 使用了 AS3933 接收后再把 125khz 的信号调制放大并通过 CC1101 发送
模块 b 通过一个 CC1101 模块接收后再用另一个 CC1101 发送
BQ24170 充电管理
CC1101 负责解调和调制以及发送信号
EM4095 读取 RFID 信号
as3933 转换低频信号为电压值
atmega3280p 主控芯片
其实现在来看这个方案有点过时了但是思路还是可以借鉴的。个人认为可以用 PN532 和 ESP32 来代替。
第二套方案
这套攻击首先并不只是单纯的中继攻击而是利用了特斯拉 fob 本身的一些漏洞,这里只研究中继方案的实施就不过多赘述。
使用两个 proxmark3,一个放在目标身旁,一个放在目标车上。在读取到目标卡信息后通过树莓派上的 yard stick one 发送射频信号完成攻击,这里多加一个外置天线放大信号
但是这种方法实战中依然会有些问题。首先中继时间会很长,如果目标设备有对延时的检测手段就会失效。第二个,也可能会有 RSSI 检测的问题,所以要想办法再外置一个天线放大信号。这是一套相对来说容易复现的方案但是可泛用性不广
近场中继攻击方案的研究实现
现代汽车在 PKES 的基础上更进一步开发出了被动进入和启动系统(PEPS,Passive Entry Passive Start)。和传统射频相比,蓝牙和 NFC 的安全程度无疑更高。但是这并不意味着其一点安全问题没有NFC 中继攻击
以下是特斯拉 NFC 卡片解锁车过程简述我们来看一下这个过程发生了什么事情
可以看到分成了五个区块
区块 1:车辆请求智能手机虚拟钥匙的应用标识符 (AID)。 车辆首先尝试寻找用于智能手机虚拟钥匙的应用,这是一个常见的智能卡选择应用类型的流程。由于这里使用的是实体 NFC 卡,而不是智能手机,卡片会回应 “6d00 (无效)”,表示找不到这个应用标识符。
区块 2:车辆请求特斯拉 NFC 卡的应用标识符 (AID)。 接着,车辆会尝试寻找用于特斯拉实体 NFC 卡的应用标识符。 因为现在使用的是实体卡,卡片会正确回应 “9000 (有效)”,表示找到了对应的应用标识符。 车辆收到 “9000” 的响应后,就认为正在和一张特斯拉 NFC 卡进行通信。
区块 3:车辆发送加密挑战 (Cryptographic Challenge)。 在确认卡片是特斯拉 NFC 卡之后,车辆会向卡片发送一个加密挑战,等待卡片对这个挑战做出有效的回应。
区块 4:等待时间延长 (WTX) 协商。 特斯拉 NFC 卡需要时间计算针对车辆挑战的加密响应。 由于计算需要一定的时间(虽然可能只有几毫秒,但对于通信来说仍然可能显得“太久”),卡片会向车辆发送 “等待时间延长 (WTX)” 消息,请求车辆等待,给自己更多的时间来完成计算。 在这段时间里,车辆和卡片之间可能会多次进行这种 WTX 协商。
区块 5:卡片发送加密响应 (Cryptographic Response)。 最终,NFC 卡完成了加密计算,并将计算得到的加密响应发送回车辆。 如果这个响应是有效的,车辆就会解锁车门,并根据车辆的配置,允许用户驾驶汽车。
现在我们已经知道了其工作的原理,接下来就是要实施正式的攻击了。
攻击场景和角色
这个中继攻击需要两名攻击者和一些设备配合完成:
- 攻击者 1 (近车端): 位于特斯拉车辆旁边,手持 Proxmark RDV4.0 设备。Proxmark 设备的作用是模拟特斯拉 NFC 卡,与车辆的 NFC 读卡器进行通信。
- 攻击者 2 (近卡端): 靠近受害者的特斯拉 NFC 卡片 (或装有特斯拉虚拟钥匙的智能手机)。 攻击者 2 可以使用任何具备 NFC 功能的设备,例如平板电脑、电脑,或者像例子中提到的 智能手机。
- 受害者: 拥有特斯拉 NFC 卡或装有特斯拉虚拟钥匙的智能手机的真实用户,但此时并不知情,也没有主动参与解锁车辆操作。
通信方式
为了让两名攻击者协同工作需要建立通信链路。有两种方式:
- 蓝牙 (BlueShark 模块): Proxmark RDV4.0 可以通过 BlueShark 模块支持蓝牙通信。攻击者 1 的 Proxmark 通过蓝牙与攻击者 2 的智能手机进行通信。
- Wi-Fi (Raspberry Pi): 使用 Wi-Fi,攻击者 1 可以将 Proxmark 连接到一个像 Raspberry Pi 这样的小型电脑。Raspberry Pi 通过蓝牙连接 Proxmark,同时通过 Wi-Fi 连接到攻击者 2 的智能手机。
攻击步骤
- 车辆发送 Select AID (选择应用标识符) 请求: 当攻击者 1 将 Proxmark 设备靠近车辆 NFC 读卡器时,车辆会首先发送 “Select AID” 请求,询问应用标识符。Proxmark (攻击者 1) 会用正确的值回应车辆,假装自己是合法的特斯拉 NFC 卡。
- Proxmark 接收 Challenge 并转发给攻击者 2 的手机: 车辆收到 Proxmark 的正确 AID 响应后,会发送加密挑战 (Challenge)。Proxmark (攻击者 1) 接收到这个 Challenge 后,通过蓝牙或 Wi-Fi 将其转发给攻击者 2 的智能手机。
- 攻击者 2 的手机与受害者的 NFC 卡交互,发送 Challenge: 攻击者 2 的智能手机接收到 Challenge 后,通过 NFC 与受害者的特斯拉 NFC 卡 (或智能手机) 进行通信。 智能手机会选择正确的 AID,并将从 Proxmark 收到的 Challenge 发送给受害者的 NFC 卡。 (本质上,攻击者 2 的手机在模仿车辆,向真正的 NFC 卡请求响应)
- 受害者的 NFC 卡计算并响应加密响应,转发给 Proxmark: 受害者的特斯拉 NFC 卡接收到 Challenge 后,会进行加密计算,生成加密响应 (Crypto Response)。这个加密响应会通过 NFC 发送回攻击者 2 的智能手机,然后智能手机再通过蓝牙或 Wi-Fi 将响应转发回给 Proxmark (攻击者 1)。
- Proxmark 将加密响应发送给车辆: Proxmark (攻击者 1) 接收到来自攻击者 2 转发的加密响应后,会将这个合法的加密响应发送给车辆的 NFC 读卡器。
我们可以研究一下 这个过程底层代码是如何工作的
代码首先进行初始化设置,包括 Proxmark 硬件和的配置。将 Proxmark 设置为 14443 卡模拟模式,使其能够模拟 NFC 卡的行为。
Proxmark 使用 <font style="color:#000000;">GetIso14443aCommandFromReader()</font>
函数 接收来自车辆 NFC 读卡器的数据。通过 <font style="color:#000000;">usarT_rxdata_available()</font>
检查 UART 端口 (用于蓝牙芯片) 是否有可用数据,目的是检查是否接收到来自智能手机的数据。如果蓝牙端口有数据,Proxmark 会先向车辆发送一个最后的 WTX (等待时间延长) 消息并且读取通过蓝牙接口接收的数据。 这样能够保证蓝牙接收的数据是来自受害者卡片的 加密响应 (crypto response)。
然后 会处理通过 NFC 接收到的数据,首先检查数据的前几个字节,以判断 NFC 消息的类型,特别是处理通信早期阶段的 底层 NFC 消息。
如果它只是接收应用层消息(apdu),代码也会处理这些消息:
当从车辆读卡器接收到challenge后,需要将这个challenge转发给攻击者 2 的智能手机。代码会将接收到的challenge数据 复制到缓冲区当中,然后通过 UART 接口发送到蓝牙芯片,由蓝牙芯片将数据传输给智能手机。智能手机上的应用程序将负责处理接收到的challenge数据。一旦通过蓝牙接收到加密响应,就通过NFC将其发送给车辆的读卡器。
在通过 NFC 发送数据之前,Proxmark 上需要进行一些准备工作: 添加 CRC 校验字节 (CRC bytes),确保数据传输的完整性。使用 <font style="color:#000000;">prepare_tag_modulation()</font>
函数进行调制。使用 <font style="color:#000000;">EmSendPrecompiledCmd()</font>
函数 通过 NFC 发送数据。但还需要创建额外的代码来在第二个攻击者的智能手机上运行,该手机离受害者的特斯拉NFC卡很近。该应用程序需要NFC、蓝牙和Wi-Fi功能才能执行中继攻击。
当第二个攻击者的智能手机上运行的Android应用程序通过Wi-Fi或蓝牙接收到来自Proxmark的challenge时,它会通过NFC将该 challenge 转发给受害者的卡,然后读取加密响应并将其发送回Proxmark。
蓝牙中继攻击
近距离身份验证系统:这种系统的目的是当可信对象在附近时进行身份验证。通过可行对象与设备无线通信实现。无钥匙进入系统是技术最常见最明显的应用。类似的技术也用于智能锁,建筑访问控制系统蓝牙距离测量方法
蓝牙通过维持 ble 连接和通信的能力来推断临近,同时保持在合理的延迟范围内。旧版本蓝牙不提供任何基于 TOF 和三角测距的测距方法。它的距离由 RSSI 或 AOA 测定。很容易收到中继攻击。并且存在大量的设备使用 BLE 进行近距离身份验证
一个最简单的中继攻击模型。只需要将中继过来的信号进行放大。这样车辆的 RSSI 值会变大这样就会认为信号源就在旁边
BLE 的中继攻击
GATT 中继攻击
- Gattacker https://github.com/securing/gattacker
- Btlejuice https://github.com/DigitalSecurity/btlejuice
HCL 中继
PHY 中继
- analog 中继 https://arxiv.org/abs/2202.06554
攻击限制
gatt 中继攻击的延迟很明显,不支持未知LTK的链路层加密
hcl 中继攻击 不支持未知LTK的链路层加密,
phy 中继攻击 受距离影响比较大
因此 我们可以通过在链路层转发PDU来结合HCI和模拟继电器的许多优点,同时避免它们的缺点。
链路层数据包结构
蓝牙链路层报文由以下字段组成
- Preamble(前导码):1 到 2 个字节,用于同步接收端
- Access Address(接入地址):占 4 个字节,用于识别特定的连接
- PDU(协议数据单位):占 2-258 字节。包含由具体的链路层数据。由 header 和 payload 组成。header 占用 2 个字节,包含一些控制信息。payload 占用 1-255 字节,包含具体的数据信息
- CRC:3 个字节,用于验证数据完整性
在蓝牙建立连接的时候会有一个 CONNECT_IND PDU 的发送,通过这些参数后主机从机才能建立连接。
链路层蓝牙劫持的细节
在基础知识部分我们有提到 BLE 建立连接依赖的是 CONNECT_IND 那么劫持的关键就是如何去修改这个 CONNECT_IND.
接下来是一些参数的获取方法:
- 获取Access Address 和 CRCInit:直接在空中包中获取或者推算。接入地址可以从空中包获取,空包计算 CRCinit(CRC24 算法)
- 获取 Channel Map:枚举 BLE 链路所使用的所有信道(监听同一个频道,每一个频道停留 4 秒,总耗时 4*37 = 148s
- 获取 Conenction interval:信道切换时间。跳频算法#1:Fn+1 =( Fn + hop )mod 37 。找一个合适的channel,监听两次报文的间隔时间处以37
- 获取Hop Increment :跳频参数,数据信道选择算法中使用。范围是5-16的随机值,测试所有的可能值
劫持的关键在 supervision timeout 机制,原理其实类似于滚动码系统当中的ROLLJAM
Supervision Timeout 机制的利用:
Supervision Timeout 是 BLE 连接的一个超时机制,规定了主从设备之间在一段时间内没有数据传输就会自动断开连接。攻击者利用这一点,通过阻断(干扰)主从设备之间的信号,使得两者在指定的时间内没有成功通信,导致超时断开。
信号干扰:
攻击者通过阻断主设备和从设备的通信,迫使连接出现延迟,无法在规定的时间内完成必要的握手和数据交换。绿色的箭头表示正常的通信,而红色的箭头代表被攻击者阻断的信号。
超时断开连接:
当信号被攻击者持续阻断,超时机制触发,主设备(Master)会主动发送一个 LL_TERMINATE_IND 指令,从而断开当前的连接。这意味着从设备(Slave)失去了原始主设备的连接,可以被攻击者利用,以重新连接或接管。
攻击者的劫持:
在主设备断开与从设备的连接后,攻击者可以尝试与从设备重新建立连接,从而实现对该连接的劫持。通过利用这种机制,攻击者可以有效地将原本的连接转移到自己控制的设备上。
六、参考资料
D2T2 - Chasing Cars: Keyless Entry System Attacks - Yingtao Zeng, Qing Yang and Jun Li([https://www.youtube.com/watch?v=rhm1TiFJc7s](https://www.youtube.com/watch?v=rhm1TiFJc7s))Lennert Wouters - Passive Keyless Entry and Start Systems - DEF CON 27 Car Hacking Village(https://www.youtube.com/watch?v=tFUdQJkKsLU&t=729s)
https://www.theverge.com/2022/9/12/23348765/tesla-model-y-unlock-drive-car-thief-nfc-relay-attack
Bluetooth LE Link Layer Relay Attacks by Sultan Qasim Khan | hardwear.io NL 2022(https://www.youtube.com/watch?v=2CvHM5gZVnY)