免责声明: 本文仅用于技术交流与安全研究,文中涉及的漏洞复现均在授权环境下进行。请勿利用文中技术进行非法活动,否则后果自负。
上个月,我参与了一款尚未上市车型的车联网安全评估项目。测试期间,我们成功利用中继攻击(Relay Attack)实现了对车辆的远程解锁。虽然当时复现了漏洞,但对底层的NFC通信细节,特别是APDU数据交换的逻辑理解尚浅。为了真正吃透其原理,本文将结合那次实战经验,对车联网数字钥匙场景下的NFC通信逻辑与中继攻击进行一次系统性复盘。
了解NFC:不仅仅是支付
提起NFC(近场通信),大家首先想到的可能是公交卡、手机支付。但事实上,它也是当前车联网数字钥匙的主流实现技术之一。目前,主流车企(如特斯拉、比亚迪)的车机方案大多遵循 CCC(Car Connectivity Consortium) 规范。与简单的门禁卡不同,车规级NFC钥匙绝非仅靠匹配UID(唯一标识符)来工作,其内部包含了一套完整的双向权限验证流程。
NFC是一种基于13.56MHz RFID技术发展而来的近场通信技术,典型通信距离小于10厘米(实际有效距离通常在4厘米左右)。它主要有三种工作模式:
- 卡模拟模式(Tag/Card Emulation):设备模拟成一张NFC卡片,例如手机中的数字钥匙或实体NFC卡。
- 读卡器模式(Reader/Writer):设备主动发射射频场(RF Field),为附近的卡片供电,并发送指令、接收响应。车辆端的NFC模块通常工作在此模式。
- 点对点模式(P2P):两个NFC设备之间直接交换数据。
NFC通信的交互逻辑
车与钥匙(手机或卡片)之间的NFC通信并非简单的“碰一下”,而是一个分阶段的协议握手过程。

上图清晰地展示了一次完整的NFC交互流程:
- 激活:卡片靠近车辆NFC感应区,车辆产生的射频场激活卡片,为其供电。
- 选择与防冲突:车辆(读卡器)发出轮询指令,通过
REQA、ATQA、SELECT、SAK 等一系列命令,在多个可能存在的卡片中选中目标UID,并建立独占通信。
- 协议激活:双方协商通信参数,例如传输速率、缓冲区大小(通过
RATS/ATS 命令)。
- APDU数据交换:这是核心的安全认证阶段。读卡器发出指令(
C-APDU),卡片进行处理(通常涉及密钥运算)后返回响应(R-APDU)。只有响应验证通过,车辆才会执行开锁动作。
什么是NFC中继攻击?
理解了标准交互流程,中继攻击的概念就很好理解了。简单说,就是“接力”并延长本应超短距离的通信信号。
正常情况下,通信链路是:合法钥匙(Tag1) <-> 车辆读卡器(Reader1),距离极近。
中继攻击则通过额外设备,将这条链路“拉长”:合法钥匙(Tag1) <-> 攻击设备A(Reader2) <-> [中继服务器] <-> 攻击设备B(Tag2) <-> 车辆读卡器(Reader1)。

攻击者需要两部手机:一部(手机1)模拟读卡器(Reader2)靠近合法钥匙;另一部(手机2)模拟卡片(Tag2)靠近车辆。两者通过网络(服务器)实时转发所有NFC通信数据。这样一来,即使钥匙和车辆相隔很远,系统也会认为钥匙就在车旁。
设想一个高危场景:车主在餐厅就餐,手机放在桌上,车辆停在门外停车场。两名攻击者协同作案,一人靠近车辆,另一人靠近手机,通过中继攻击在几秒内即可解锁并启动车辆,威胁极大。
NFC中继攻击实践复现
为了深入研究,我们可以搭建环境进行授权测试。你需要准备:两台支持NFC并已安装特定框架(如Xposed)的安卓手机、一台作为服务器的电脑。
所需工具:
- 手机App: NFCGate (GitHub:
nfcgate/nfcgate)
- 服务端: NFCGate Server (GitHub:
nfcgate/server)
复现步骤:
-
搭建服务器:在电脑上启动热点,让两台手机连接。运行下载的 server.py 脚本,服务端会开始监听特定端口。

-
配置客户端:在两台手机的NFCGate应用设置中,填入电脑(服务器)的IP地址和端口号(默认为5566)。


-
启动中继:在NFCGate主界面选择“Relay Mode”功能。一台手机设置为 Tag(卡模拟) 模式,另一台设置为 Reader(读卡器) 模式。两者成功连接到服务器后,界面会显示连接状态。

-
实施攻击:将设置为 Reader 模式的手机靠近合法钥匙(如车主手机),将设置为 Tag 模式的手机靠近车辆NFC感应区。此时,中继链路建立,通信数据开始转发。如果车辆被成功解锁,则证明中继攻击复现成功。
-
分析数据:攻击过程中,应用会记录所有交互的APDU数据包,这是学习通信逻辑的关键。通过对这些数据进行逆向分析,可以理解认证流程。

关键APDU数据解析:
从日志中,我们可以看到诸如 90 00、6A 82 这样的状态码。它们是理解通信结果的关键:
C-APDU (读卡器发出的指令):
00 A4 04 00 ... <-- Select File (标准指令,选择应用)
80 / 84 开头: 行业标准或私有指令 (Proprietary / GlobalPlatform)
R-APDU (卡片回复):
6A 82 <-- File Not Found (文件未找到)
90 00 <-- Success (成功)
90 00 这个状态字(SW1 SW2)代表成功,通常在认证通过的最后一条响应中出现。了解APDU的结构有助于我们更深入地分析:
C-APDU 结构(读卡器 -> 卡片):
| 必须部分 (Header) |
|
|
|
可选部分 (Body) |
|
|
| CLA |
INS |
P1 |
P2 |
Lc |
Data |
Le |
| 指令类别 |
指令码 |
参数1 |
参数2 |
后续数据长度 |
数据域 |
期望响应长度 |
R-APDU 结构(卡片 -> 读卡器):
| 可选部分 (Body) |
必须部分 (Trailer) |
| Data |
SW1 SW2 |
| 响应数据 |
状态字 |
如何防御NFC中继攻击?
中继攻击的本质是破坏了“近场”通信的距离前提。因此,防御的核心思路是引入距离或时延验证。
- UWB(超宽带)技术:这是目前最有效的解决方案之一。UWB能够进行厘米级精度的测距,通过计算信号的飞行时间(ToF)来判断设备与车的真实距离。中继攻击引入的网络延迟会远大于真实物理传输时间,从而被系统识别并拒绝。
- 严格的时序限制:在NFC通信协议层进行加固。
- 设定极短的帧等待时间(FWT),例如要求卡片必须在20毫秒内响应。
- 禁用等待时间扩展(WTX)指令,防止攻击者通过请求加时来掩盖网络延迟。
- 多因素认证(MFA):结合生物特征(如指纹、人脸识别)或车内蓝牙/PKE(被动无钥匙进入)的二次确认。即使信号被中继,攻击者也无法提供第二重认证因子。
- 运动传感器检测:在智能钥匙或手机钥匙应用中集成行为检测。例如,钥匙在静止一段时间后自动进入休眠状态,只有当加速度计检测到被拿起或移动时,才唤醒NFC功能。这让放置在桌上的手机难以被远距离利用。
对于汽车安全研发人员和相关领域的安全研究者而言,理解NFC中继攻击的原理与实现,是构建更坚固车联网安全防护的起点。希望本文的分享,能为大家在云栈社区的技术交流中提供一些有价值的参考。