Vehicles Export
Vehicles,Cars,Pickup truck,truck,Off-road vehicle,SUV Export
可选:点击以支持我们的网站
Distributor Contact Email:
China NEV (New Energy Vehicle).BYD,Chery,Skyworth,Lixiang,Hycan,
Aion,Deepal,etc.
Vehicles,Cars,Pickup truck,truck,Off-road vehicle,SUV Export
Jetta is the thirteenth brand of Volkswagen Group.
Skywell's first strategic SUV
随着蓝牙低功耗(BLE)技术在汽车领域的普及,基于GATT(通用属性协议)的无钥匙进入系统(Passive Keyless Entry, PKE)正面临严峻的安全挑战。中继攻击(Relay Attack)利用物理层信号放大或协议层转发,绕过距离验证机制,成为此类系统的头号威胁。本文将从开发者视角,深入剖析如何在GATT服务层设计抗中继的安全架构,并给出可落地的代码实现与性能分析。
传统RKE(遥控钥匙)依赖UHF射频,而BLE PKE通过手机或钥匙端的GATT服务实现门锁控制。其核心矛盾在于:BLE的RSSI(信号强度指示)易受环境干扰,无法作为可靠的距离证明;而标准GATT的读写操作缺乏时间戳与挑战-响应机制,攻击者只需桥接手机与车辆的BLE链路即可完成中继。
技术挑战包括:
我们设计了一种融合密码学与时间约束的GATT安全服务。核心原理如下:
1. 数据包结构:定义三个特征值(Characteristic):
- CMD_CHAR(写):车辆发送挑战数C(16字节随机数)。
- RESP_CHAR(读/通知):钥匙返回响应R = AES_CMAC(K, C || Seq),其中K为预共享密钥,Seq为单调递增计数器。
- STATUS_CHAR(读):车辆返回认证状态(0x00失败,0x01成功)。
2. 抗中继核心机制:车辆在发送挑战后,启动高精度计时器,测量从发送挑战到收到有效响应的时间差Δt。若Δt > 预设阈值(如10ms),则判定为中继攻击(因物理距离导致信号传输延迟,而中继器引入额外处理延迟)。
3. 状态机:
- IDLE → 车辆扫描到钥匙广播 → 建立GATT连接。
- CHALLENGE_SENT → 车辆写入CMD_CHAR,启动计时器。
- WAITING_RESP → 钥匙计算并通知响应。
- VERIFIED → 车辆校验响应(AES-CMAC)且Δt < 阈值 → 解锁车门。
- FAILED → 超时或校验失败 → 断开连接。
数学上,中继攻击成功的概率为:
P_success = P(Δt_relay < T_threshold)。由于中继器必须转发挑战并接收响应,其最小延迟为2 * (t_prop + t_proc),而真钥匙的延迟仅t_proc + t_prop。通过设置T_threshold = 2 * t_proc_max + t_prop_max,可有效排除中继。
以下为基于Zephyr RTOS的车辆端GATT服务实现片段。代码展示了如何创建安全特征、处理写请求并启动RTT测量。
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/sys/byteorder.h>
#include <zephyr/timing/timing.h>
/* 预共享密钥和挑战缓冲区 */
static uint8_t challenge[16];
static uint8_t expected_response[16];
static struct timing_t start_time, end_time;
static bool challenge_active = false;
/* 挑战特征写回调 */
static ssize_t on_challenge_write(struct bt_conn *conn,
const struct bt_gatt_attr *attr,
const void *buf, uint16_t len,
uint16_t offset, uint8_t flags)
{
if (len != sizeof(challenge)) {
return BT_GATT_ERR(BT_ATT_ERR_INVALID_ATTRIBUTE_LEN);
}
memcpy(challenge, buf, len);
/* 启动计时器 */
timing_init();
timing_start();
start_time = timing_counter_get();
challenge_active = true;
/* 触发钥匙端计算响应(通过通知或读特征) */
bt_gatt_notify(conn, attr, challenge, sizeof(challenge));
return len;
}
/* 响应特征读回调:车辆读取钥匙的响应 */
static ssize_t on_response_read(struct bt_conn *conn,
const struct bt_gatt_attr *attr,
void *buf, uint16_t len,
uint16_t offset)
{
if (!challenge_active) {
return BT_GATT_ERR(BT_ATT_ERR_UNLIKELY);
}
/* 停止计时器并计算RTT */
end_time = timing_counter_get();
uint32_t delta_us = timing_cycles_to_ns(end_time - start_time) / 1000;
challenge_active = false;
/* 验证响应(此处简化,实际应调用AES-CMAC) */
if (memcmp(buf, expected_response, 16) == 0 && delta_us < 10000) {
/* 认证成功,更新状态特征 */
uint8_t status = 0x01;
bt_gatt_notify(conn, attr, &status, 1);
return 0;
} else {
uint8_t status = 0x00;
bt_gatt_notify(conn, attr, &status, 1);
return BT_GATT_ERR(BT_ATT_ERR_AUTHENTICATION);
}
}
/* GATT服务定义 */
BT_GATT_SERVICE_DEFINE(pke_service,
BT_GATT_PRIMARY_SERVICE(BT_UUID_DECLARE_128(0x1234, 0x5678, ...)),
BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_16(0xFF01),
BT_GATT_CHRC_WRITE | BT_GATT_CHRC_NOTIFY,
BT_GATT_PERM_WRITE_AUTHEN,
NULL, on_challenge_write, NULL),
BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_16(0xFF02),
BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY,
BT_GATT_PERM_READ_AUTHEN,
on_response_read, NULL, NULL),
BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_16(0xFF03),
BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY,
BT_GATT_PERM_READ_AUTHEN,
NULL, NULL, NULL),
);
关键点:
- 使用BT_GATT_PERM_WRITE_AUTHEN确保写操作需经过配对加密(LE Secure Connections)。
- RTT测量使用timing API(基于硬件周期计数器),精度可达1μs。
陷阱1:连接间隔对RTT的影响。BLE默认连接间隔为7.5ms-50ms,若在连接事件间发送挑战,单次传输延迟可能高达数十ms。解决:在连接参数中设置最小间隔(如7.5ms),并使用bt_gatt_notify立即发送(无需等待连接事件)。
陷阱2:AES-CMAC计算耗时。在Cortex-M0上,AES-128计算约需0.2ms,加上密钥派生可能超过1ms。优化:预计算部分密钥,使用硬件加密引擎(如CC310)。
陷阱3:时序漂移。晶振频率误差会导致RTT测量偏差。补偿:在钥匙端发送响应前加入固定延迟(如1ms),车辆端减去该延迟。
我们在NXP i.MX RT1060(车辆端)和Nordic nRF52840(钥匙端)上进行了测试。结果如下:
本文提出的基于GATT的挑战-响应与RTT测量方案,在无需额外硬件的前提下,将中继攻击成功率降至理论最低。未来可结合蓝牙5.1的到达角(AoA)定位,实现厘米级距离验证,进一步强化安全性。开发者应注意,该方案依赖精确的时钟同步与低延迟连接参数,在量产前需进行多环境(金属屏蔽、多径)测试。