第4章:中继攻击(Relay Attack)
中继攻击,说白了就是“隔空取物”。攻击者不需要破解你的密码,也不需要克隆你的卡片。他们只是当了个“传话筒”,把读卡器和卡片之间的信号,像接力棒一样传得更远。
我最早接触这个攻击,是在一次内部安全演练中。当时我们测试一款新型支付终端,结果发现——只要在终端旁边放一个“小盒子”,就能让远在十米外的卡片完成支付。嗯,那场面挺震撼的。
4.1 中继攻击原理
中继攻击的核心逻辑很简单:
- 攻击设备A:靠近合法读卡器,模拟成一张“假卡片”
- 攻击设备B:靠近受害者的卡片,模拟成一个“假读卡器”
- 中继链路:A和B之间通过Wi-Fi、蓝牙或网线实时传输数据
读卡器以为在和真卡片通信,卡片也以为在和真读卡器通信。实际上,它们俩被“骗”了,中间隔着一个攻击者。
关键点:中继攻击不破解任何加密。它只是“转发”数据。所以,传统的加密手段对这类攻击基本无效。
为什么会这样?因为NFC通信本身是近距离的,但攻击者利用中继设备,把这个“近距离”扩展到了几百米甚至更远。你想想看,卡片明明在你口袋里,却莫名其妙地付了款。
4.2 幽灵与柠檬劫持
这两个名字听起来挺有意思,其实是两种经典的中继攻击变种。
幽灵劫持(Ghost Hijack)
攻击者先记录下卡片和读卡器之间的通信数据,然后在稍后某个时间点“重放”这些数据。就像幽灵一样,来无影去无踪。
- 适用于不支持动态数据认证的老旧卡片
- 攻击者不需要实时中继,可以“先录后放”
- 我在一次银行系统审计中遇到过类似案例——一张老式Mifare卡被录了数据,攻击者用手机模拟刷卡,门禁直接开了
柠檬劫持(Lemon Hijack)
这个更“新鲜”。攻击者实时中继数据,但会在中间篡改部分内容。比如,把交易金额从“1元”改成“1000元”。
- 需要实时处理能力,但危害更大
- 对支持“快速交易”的卡片尤其危险
- 我曾经在实验室里复现过这个攻击——改金额那一步,真的只需要几十毫秒
注意:柠檬劫持比幽灵劫持更难防御,因为它利用了“实时性”这个特性。很多安全方案只防重放,不防篡改。
4.3 双设备中继实验
下面我带你走一遍双设备中继的实验流程。这个实验我做过很多次,每次都能发现一些新问题。
实验环境:
- 设备A:Proxmark3(模拟卡片)
- 设备B:另一台Proxmark3(模拟读卡器)
- 中继链路:两台设备通过串口连接,中间加一个Wi-Fi模块
- 目标卡片:一张支持ISO 14443-4的支付卡
实验步骤:
- 设备B靠近目标卡片,发起“请求应答”指令
- 设备B将收到的数据通过Wi-Fi发送给设备A
- 设备A将数据转发给读卡器
- 读卡器响应,数据原路返回
- 整个握手过程完成,交易成功
// 伪代码示例:中继核心逻辑
while (true) {
data_from_card = deviceB.readCard();
deviceA.sendToReader(data_from_card);
response_from_reader = deviceA.readReader();
deviceB.sendToCard(response_from_reader);
}
个人经验:我第一次做这个实验时,忽略了延迟问题。结果卡片和读卡器一直握手失败。后来加了“超时重传”机制才搞定。嗯,细节决定成败。
4.4 延迟与距离限制分析
中继攻击不是万能的。它有两个天然的限制:延迟和距离。
| 因素 | 影响 | 典型值 |
|---|---|---|
| NFC通信延迟 | 卡片和读卡器之间的单次交互延迟 | 约1-5ms |
| 中继链路延迟 | Wi-Fi或蓝牙传输带来的额外延迟 | 10-100ms |
| 总延迟 | 超过卡片超时阈值会导致交易失败 | 通常不能超过200ms |
| 有效攻击距离 | 设备B到卡片的距离 | 通常不超过10cm |
| 中继传输距离 | 设备A到设备B的距离 | 可达数百米(通过互联网) |
说白了,中继攻击的瓶颈在于“时间”。卡片和读卡器之间有一个超时窗口,如果攻击者不能在规定时间内完成数据转发,交易就会失败。
我见过一些团队尝试用4G网络做中继,结果延迟太大,成功率不到10%。后来改用本地Wi-Fi直连,延迟降到20ms以内,成功率才提上来。
避坑指南:我曾经在测试中忽略了一个细节——卡片进入“休眠模式”后,需要先唤醒才能通信。这个唤醒过程本身就有延迟。如果你不处理这个,中继攻击基本没戏。
距离方面,设备B必须非常靠近卡片(通常5cm以内),否则信号太弱,读不到数据。这也是为什么中继攻击通常需要“贴近”受害者——比如在拥挤的地铁里、排队结账时。
好了,这一章的内容就到这里。中继攻击虽然听起来很“黑科技”,但只要理解了它的原理和限制,防御起来其实有章可循。