基于GFSK多链路监控的BLE中继攻击防御方案详解
1. 项目概述:为什么要在BLE测距中引入GFSK监控?
在汽车无钥匙进入、智能门锁或者资产追踪这些场景里,我们经常需要判断一个设备(比如你的手机或车钥匙)离另一个设备(比如你的车或家门)到底有多远。蓝牙低功耗(BLE)的接收信号强度指示(RSSI)测距是一种非常普遍且成本低廉的方案。原理很简单:信号强度会随着距离增加而衰减,通过测量RSSI值,就能估算出大致的距离。
但这个方案有个致命的“阿喀琉斯之踵”:中继攻击。攻击者根本不需要破解你的加密算法,他们只需要用两台设备,一台放在你的真钥匙旁边放大信号,另一台放在车旁边接收放大后的信号。这样一来,车会“以为”钥匙就在附近,但实际上钥匙可能远在几十米甚至几百米开外。这种攻击直接绕过了加密,在物理层进行欺骗,防不胜防。
传统的BLE反制手段主要有两种,但各有各的“坑”。第一种是无连接广播方式,设备不断广播信号,接收方通过信号强度判断距离。这种方式简单,但广播信号是公开的,极易被中继,毫无安全性可言。第二种是建立安全的BLE连接,通过配对绑定来认证设备。这确实能防中继,因为攻击者无法介入已配对的连接。但问题来了,如果你的系统需要同时监控多个设备(比如一辆车要同时判断钥匙、手机、智能手表哪个离得最近),BLE连接是独占的。主设备(车)同一时间只能与一个从设备保持连接,要监控多个就得频繁断开重连,导致功耗飙升、响应变慢,用户体验极差。
所以,我们需要一个“旁观者清”的方案:在不干扰原有BLE安全连接的前提下,能同时监听多个链路的通信,并独立进行高精度的距离验证。这就是引入通用FSK(GFSK)调制技术进行多链路监控的核心思路。GFSK是BLE物理层使用的调制方式,KW36/KW38这类无线MCU的射频前端,可以通过软件配置,使其不仅能发送BLE信号,还能以“监听模式”接收并解析空中的BLE数据包。这样一来,我们可以设计一个独立的“监控器”角色。车上的主BLE模块正常与各个钥匙建立安全连接,同时,这个GFSK监控器像窃听器一样,同步监听所有链路的空中信号,通过比对监控器测得的RSSI与主连接模块内部的RSSI,就能有效识别出信号是否被恶意中继放大。
这个方案的精妙之处在于,它将“安全连接”和“距离验证”这两个任务解耦了。安全连接保障了通信的机密性和完整性,而GFSK多链路监控则专职负责物理层的距离可信验证,两者通过CAN或LIN总线协同工作,在保障安全的同时,实现了对多设备的高效、低功耗监控。
2. 系统架构与核心角色解析
要实现上述构想,我们需要一个清晰的三角色系统架构。理解每个角色的职责和它们之间的数据流,是成功部署整个方案的基础。
2.1 角色定义与数据流向
整个系统包含三个核心角色:主机、从机和监控器。它们的关系和数据流向构成了方案的主干。
主机:通常指系统中的中央控制单元,例如汽车车身控制器。它承担两个主要功能:
- BLE连接管理:主动扫描并与其需要交互的从机(如多个车钥匙)建立一对一的、安全的BLE连接。这些连接用于正常的指令传输和数据交换。
- 连接信息分发:在成功建立每一个BLE连接后,主机会立刻从连接过程中获取一组该连接独有的、动态生成的链路层参数。这组参数是监控器能否成功“窃听”该连接的关键。主机会通过CAN总线或LIN总线这类可靠的汽车内部网络,将这组参数实时发送给监控器。
从机:指被监控的终端设备,如车钥匙、智能手机等。它的行为相对单纯:响应主机的连接请求,建立安全的BLE连接,并按照连接间隔进行常规的数据通信。从机对监控器的存在是无感知的。
监控器:这是本方案的核心与创新点。它是一个独立的硬件单元(基于另一块KW36/KW38开发板),其核心是一个配置为GFSK监听模式的射频前端。它的工作流程如下:
- 参数接收:通过CAN/LIN总线,从主机接收所有活跃BLE连接的链路层参数。
- 信道同步与跳频追踪:利用接收到的参数,监控器内部的算法能够精确预测出每条BLE连接当前及未来所使用的射频信道。
- 数据包嗅探与RSSI测量:监控器将其射频前端调谐到预测的信道上,接收并解析空中传输的BLE数据包。对于每一个成功解码的数据包,它不仅提取数据内容,更关键的是记录下该数据包到达时的原始RSSI值。
- 数据上报与比对:监控器将测量到的原始RSSI数据通过总线回传给主机或上层安全算法。安全算法会对比主机自身在连接中测得的RSSI和监控器独立测得的RSSI。在无中继攻击的正常情况下,两者测得的信号强度应处于合理的、与距离相关的范围内。如果监控器测得的RSSI异常强劲(例如,主机测得-70dBm,监控器却测得-40dBm),而物理上监控器与主机的天线位置很近,这就强烈暗示存在一个外部中继器在放大信号。
2.2 通信总线选型:CAN vs. LIN
主机与监控器之间的通信总线选择至关重要,它需要满足实时、可靠的要求。
- CAN总线:是汽车网络的中坚力量,具有高可靠性、多主结构和优秀的错误检测机制。其带宽高,适合传输数据量稍大、实时性要求极高的场景。如果系统需要监控的链路数量很多,或者需要传输除链路参数外的其他诊断信息,CAN是首选。
- LIN总线:是一种低成本、单主结构的串行通信网络。其速度和带宽低于CAN,但足以胜任传输几条链路的参数信息。对于链路数量较少(如少于4条)、成本敏感的应用,LIN是一个经济实惠的选择。
注意:在实际硬件连接时,如果使用LIN总线,需要注意使能自动波特率功能。这需要将监控器板上的LIN控制器UART的TX引脚(例如KW38的PTB1)与主机的LIN总线通过一个二极管进行特殊连接,具体电路需参考芯片数据手册。这是LIN总线初始化的一个常见坑点。
这个架构的优势在于,监控器作为一个独立的观察者,不参与也不影响原有的安全通信流程。它只“看”不说,通过物理层的信号分析来提供安全佐证,实现了安全性与系统复杂度的平衡。
3. GFSK监听模式的关键技术实现
让KW36/KW38的射频前端从标准的BLE模式“变身”为一个BLE数据包监听器,需要对底层寄存器进行精细的配置。这就像把一台收音机从接收固定广播,改造成能追踪特定加密电台频率的扫描仪。
3.1 GFSK参数配置:模拟BLE接收机
BLE数据包有特定的帧结构。为了让GFSK模式能正确识别和解码BLE数据包,我们必须调整其数据包处理单元的参数,使其与BLE的物理层规范对齐。这主要通过修改SDK中genfsk_cfg.h或相关配置文件中的一组宏定义来实现:
/* 关键参数配置示例 */ #define gGenFskDefaultLengthFieldSize_c (8) /* 长度字段为8位,与BLE数据包PDU长度字段匹配 */ #define gGenFskDefaultH1FieldSize_c (0) /* H1字段大小设为0,因为BLE帧头无此字段 */ #define gGenFskDefaultH0Value_c (0x0000) /* H0匹配值,通常用于帧同步,此处根据前导码调整 */ #define gGenFskDefaultH0Mask_c 0 /* H0匹配掩码 */ #define gGenFskDefaultH1Value_c (0x0000) /* H1匹配值 */ #define gGenFskDefaultH1Mask_c 0 /* H1匹配掩码 */核心原理:LengthFieldSize设置为8,是因为BLE链路层数据单元(PDU)的长度信息正好是1个字节(8位)。配置H0/H1相关参数,是为了让射频基带能够正确识别数据包的开始,通常需要匹配BLE数据包的前导码和接入地址(Access Address)的特征。这些配置本质上是在“欺骗”GFSK硬件,让它按照BLE的规则去解析接收到的比特流。
3.2 连接信息获取与解析:窃听的“钥匙”
监控器要监听一个加密的BLE连接,首先得知道它们什么时候、在哪个频道“说话”。这些信息包含在连接建立的第一个握手包——CONNECT_IND或CONNECT_REQPDU中。主机在成功建立连接后,可以从芯片的链路层寄存器中直接读取这些关键参数:
- 接入地址:该连接的唯一标识,用于从嘈杂的无线电波中过滤出目标数据包。
- CRC初始值:用于校验数据包的完整性,监控器需要此值来验证收到的包是否属于目标连接。
- 连接间隔:主机和从机每隔多久通信一次。
- 信道跳频增量:决定每次连接事件后,信道如何变化。
- 信道映射:指示了允许跳频的37个数据信道中的哪些是可用的。
在KW3x芯片中,这些信息存储在特定的寄存器中。例如,连接间隔可能存放在CONN_INTERVAL寄存器,而接入地址的低32位和高16位可能分别存放在PDU_ACCESS_ADDR_L_REGISTER和PDU_ACCESS_ADDR_H_REGISTER中。主机端的软件需要将这些寄存器值读取出来,封装成消息,通过CAN/LIN总线发送给监控器。
3.3 信道跳频算法同步:预测下一次“密谈”地点
BLE使用自适应跳频来避免干扰。监控器必须完美复现主机和从机所使用的跳频算法,才能持续追踪。该算法遵循蓝牙核心规范,其核心是一个伪随机序列,输入包括:
- 接入地址
- 信道跳频增量
- 当前连接事件计数器
- 信道映射
监控器在收到主机发来的连接参数后,需要在本地用同样的算法进行初始化。之后,每监听到一个数据包,它就根据算法计算出下一个连接事件应该使用的信道号,并提前将射频前端调谐到那个信道等待。这个过程必须精确到微秒级,因为BLE连接事件的窗口非常短(通常只有几毫秒)。
3.4 中断处理与双包捕获:一次连接,两个数据包
在一个BLE连接事件中,通信是双向的:主机先发送一个数据包给从机,从机在约定好的时间窗口内回复一个数据包。对于监控器来说,它需要在一个连接事件内捕获这两个数据包。
这需要对GFSK驱动的中断服务程序进行修改。标准的GFSK接收流程是:收到一个包,产生中断,处理,然后回到空闲状态。为了捕获主从两个包,我们需要修改逻辑:
// 在GFSK中断服务程序(ISR)中的简化逻辑 if (收到数据包) { uint16_t byteCount = 读取包长度; if (packetFromMaster == 1) { // 判断当前包来自主机 // 1. 保存主机包的数据和RSSI masterPacketLen = byteCount; FLib_MemCpy(masterPacket, rxBuffer, masterPacketLen); masterRSSI = 读取RSSI寄存器值; // 2. 关键:不清除超时定时器,立即重新使能接收机(Rx) GENFSK->XCVR_CTRL = 5; // 示例:重新触发接收的寄存器操作 packetFromMaster = 0; // 标记下一个预期包来自从机 } else { // 当前包来自从机 // 1. 保存从机包的RSSI slaveRSSI = 读取RSSI寄存器值; // 2. 设置包来自主机标志,为下一个连接事件做准备 packetFromMaster = 1; // 3. 设置接收完成事件,并取消超时定时器 eventFlags |= gGenfskRxEventFlag_c; GENFSK_TimeCancelEvent(&rxTimeoutTimer); } }这里有个关键技巧:收到主机包后,不能像通常那样结束接收流程,而必须立即重启接收机,以准备接收紧随其后的从机回复包。同时,需要关闭或调整接收超时机制,防止在等待从机回复时误触发超时。
3.5 禁用DCOC校准:以速度换稳定
直流偏移校准是射频接收中的一项重要技术,用于消除接收链路本身的直流偏差,提高接收灵敏度。但这个过程需要一定时间(通常是几十微秒)。在密集的多链路监控场景下,监控器需要在不同信道间快速切换,DCOC校准带来的时间开销可能导致错过关键的数据包。
因此,在链路监控模式下,我们有时需要选择禁用DCOC校准。这是通过清零XCVR_RX_DIG->RX_DIG_CTRL寄存器中的RX_DCOC_CAL_EN位来实现的。这样做会略微降低接收机的灵敏度和动态范围,但换来了信道切换的极致速度。在实际应用中,如果信号强度足够(例如在车内短距离场景),这个权衡通常是利大于弊的。
实操心得:是否禁用DCOC需要根据实际环境测试决定。可以在代码中做成一个可配置的选项。在实验室近距离调试时可以先禁用,以简化问题。在实际部署前,应在最差的信号条件下测试启用和禁用DCOC两种情况下的包捕获率,选择更可靠的方案。
4. 多链路监控的调度与管理策略
单个链路的监控已经颇具挑战,而现实应用往往需要同时监控多个目标。如何让一个监控器有条不紊地“监听”多个并行的BLE对话,是工程实现中的核心难题。
4.1 多链路监控的挑战与核心思路
想象一下,监控器只有一个“耳朵”(射频前端),但它需要听清楚四个同时进行的、在不同频道上按不同时间表进行的对话。难点在于:
- 时间冲突:多个连接的连接事件可能在时间上重叠或非常接近。
- 信道冲突:不同连接可能在同一时刻跳频到同一个信道上,造成数据包混淆。
- 资源有限:监控器的处理能力、内存和时序调度能力都是有限的。
解决这一挑战的核心思路是时分复用和精确预测。监控器无法真正同时接收多个信道,但它可以在不同连接的通信间隙,快速切换信道,捕捉每一个连接的“发言时刻”。这要求监控器为每一条被监控的链路维护一个独立的“上下文”,包含其所有连接参数和下一次通信的预测时间与信道。
4.2 基于锚点的同步与调度算法
原文图6和图7揭示了一种高效的调度策略。其核心是选择一个连接作为时间锚点。
操作流程如下:
- 锚点同步:监控器首先在所有可能的信道上进行扫描,或者等待来自主机的指令,以锁定其中一个连接(例如S1)的第一个数据包。一旦捕获到S1的数据包,监控器就与S1的连接事件时间线实现了同步。
- 偏移量计算:主机通过CAN/LIN总线,不仅发送每个连接的参数,还会发送各连接相对于某个参考点(通常是锚点S1)的时间偏移量。这个偏移量是固定的,由主机在建立连接时确定。
- 预测与监听:监控器以S1的连接事件为基准,根据已知的固定偏移量,精确预测出连接S2、S3、S4的通信窗口。例如,S2总是在S1事件结束后20毫秒开始。监控器的工作流程就变成了一个循环:
- 监听S1的信道,捕获主从包。
- 快速切换到S2的信道,等待并捕获其数据包。
- 依次处理S3、S4。
- 完成一轮后,根据各连接的连接间隔,计算下一轮监听的时间点,进入休眠或等待状态以节省功耗。
这种方法的优势在于,监控器只需要与一个链路(锚点)进行硬同步,其他链路的同步都是通过固定的时间偏移推导出来的,大大降低了同步的复杂度和时序误差的累积。
4.3 链路上下文管理
在监控器软件中,需要定义一个数据结构来管理每条链路:
typedef struct { uint32_t access_address; // 接入地址 uint16_t conn_interval; // 连接间隔(单位:1.25ms) uint16_t slave_latency; // 从机延迟 uint16_t timeout; // 监督超时 uint8_t hop_increment; // 跳频增量 uint8_t channel_map[5]; // 信道映射 uint32_t crc_init; // CRC初始值 uint16_t time_offset; // 相对于锚点的时间偏移 uint32_t next_event_counter; // 下一个连接事件计数器 uint8_t next_channel; // 预测的下一个信道 int8_t last_master_rssi; // 上一次收到的主机包RSSI int8_t last_slave_rssi; // 上一次收到的从机包RSSI } ble_link_context_t;监控器维护一个ble_link_context_t数组。每次成功捕获一个数据包,就更新对应链路的RSSI值和事件计数器,并利用跳频算法计算出该链路下一次通信的信道,更新next_channel和next_event_counter。调度器根据所有链路下一次事件的预测时间,决定下一个监听目标。
4.4 冲突处理与容错机制
即使计划再周密,冲突和丢包也在所难免。必须设计容错机制:
- 信道冲突:如果预测到两个链路的下次事件时间非常接近,且信道不同,监控器必须做出取舍。一个策略是优先监听连接间隔更短或安全等级要求更高的链路。另一个策略是评估切换信道所需的时间,如果时间允许,可以尝试快速连续捕获。
- 丢包处理:如果某个链路的预期数据包没有收到,监控器不应陷入死等。应设置一个合理的超时时间,超时后立即放弃,切换到下一个预定的监听任务。同时,该链路的上下文需要标记“失步”,可以通过等待主机重新发送该链路的参数,或者在后续监听中尝试重新捕获其数据包来恢复同步。
- 动态优先级:可以为每条链路设置一个动态优先级。例如,连续多次成功监听的链路可以略微降低优先级,而最近发生丢包或RSSI波动异常的链路则提高优先级,确保监控资源向不稳定的链路倾斜。
5. 硬件搭建与软件移植实战指南
理论最终需要落地。下面我们基于恩智浦的FRDM-KW36/KW38开发板,一步步搭建演示环境,并将监控代码移植到你的项目中。
5.1 硬件准备与连接
你需要准备至少六块开发板(B1-B6)、USB线、杜邦线和电源。
- B1 (主机):运行修改后的
w_uart_linkMonitor工程。负责连接从机,并通过CAN/LIN转发连接参数。 - B2 (监控器):运行
conn_test_linkMonitor工程。负责监听空中数据包。 - B3-B6 (从机):运行标准的
w_uart工程。作为被连接的设备。
关键硬件连接步骤(以CAN为例):
- 供电:使用12V适配器给B1或B2板供电,并通过板间的VIN和GND为其他板供电,确保共地。
- CAN总线连接:
- 找到B1和B2板上的CAN收发器接口(例如J13接头)。
- 使用杜邦线连接B1的CAN_H到B2的CAN_H。
- 连接B1的CAN_L到B2的CAN_L。
- 连接B1的GND到B2的GND(至关重要,消除共模干扰)。
- LIN总线连接额外步骤:如果使用LIN,除了连接LIN线(通常为单线),还需要连接一个使能引脚,并可能需要配置上拉电阻。具体请参考板级支持包中的LIN示例。
5.2 软件获取与工程导入
恩智浦提供了两种方式:
- 直接使用预移植的SDK(快速评估):从应用笔记AN12872的配套软件包(AN12872SW)中,找到对应KW36(SDK_2.2.3)或KW38(SDK_2.6.5)的完整SDK。里面已经包含了修改好的三个工程,路径清晰,直接使用IAR或MCUXpresso IDE打开即可编译。
- 手动移植到现有SDK(集成到自有项目):如果你已经有一个基于新版SDK的项目,需要手动替换关键文件。将软件包中的源文件复制到你的SDK目录对应位置:
conn_test_linkMonitor/->SDK/boards/frdmkw3x/wireless_examples/genfsk/w_uart_linkMonitor/->SDK/boards/frdmkw3x/wireless_examples/bluetooth/- 然后,用软件包中的文件覆盖SDK里的以下五个核心文件:
middleware/wireless/bluetooth_x.x.x/application/common/ble_conn_manager.c/.hmiddleware/wireless/framework_x.x.x/SerialManager/Source/UART_Adapter.c(用于LIN/CAN适配)middleware/wireless/genfsk_x.x.x/source/genfsk_isr.cmiddleware/wireless/genfsk_x.x.x/source/genfsk_ll.c
重要警告:手动移植时,务必仔细比对替换文件与原有文件的差异。新版SDK的底层驱动可能有更新,直接覆盖可能导致编译错误或运行时异常。建议使用
diff工具查看差异,并将关键修改(如中断处理逻辑、DCOC禁用代码)手动合并到你的新版SDK文件中,而不是盲目覆盖。
5.3 测试流程与结果验证
- 编译与下载:分别编译主机、监控器、从机工程,并下载到对应的开发板。
- 串口终端设置:将B1(主机)和B2(监控器)通过USB连接到电脑。打开两个串口终端工具(如Tera Term、PuTTY),配置参数为:115200波特率,8数据位,无校验,1停止位,无流控。
- 设备上电与启动:
- 给B3-B6从机上电,它们会自动开始广播。
- 在主机(B1)的串口终端,你会看到初始化信息。按下B1板上的SW2按钮,主机开始扫描、连接从机,并通过CAN/LIN向监控器发送连接参数。
- 在监控器(B2)的串口终端,你将看到类似以下的输出:
这表示监控器成功捕获了多条链路的通信,并输出了每条链路的接入地址、连接间隔以及分别从主机包和从机包测量到的RSSI值。[MONITOR] Link 0: AA=0x8E89BED6, CI=30ms, RSSI_M=-65, RSSI_S=-68 [MONITOR] Link 1: AA=0x12345678, CI=45ms, RSSI_M=-70, RSSI_S=-72 ...
- 结果分析:成功的标志是监控器能稳定、持续地输出所有已连接链路的RSSI信息。你可以尝试移动某个从机,观察其RSSI值的变化是否符合预期。安全验证的核心在于,比较主机串口输出的自身测量的RSSI(如果有输出)与监控器输出的RSSI。在无攻击情况下,两者应大致相当(考虑到天线位置差异,可能有几个dB的偏差)。如果监控器报告的RSSI显著强于主机自身报告的RSSI,则可能触发了中继攻击警报。
6. 常见问题、调试技巧与方案优化
在实际动手实现的过程中,你几乎一定会遇到各种问题。下面是我在调试这个方案时踩过的一些坑和总结的技巧。
6.1 典型问题排查速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 监控器收不到任何数据包 | 1. GFSK参数配置错误。 2. 信道跳频算法不同步。 3. CAN/LIN通信失败,监控器未获得连接参数。 4. 天线或射频路径问题。 | 1. 检查gGenFskDefaultLengthFieldSize_c等宏定义,确保与BLE规范一致。用逻辑分析仪抓取空中BLE包,核对前导码和接入地址。2. 在监控器代码中打印计算出的下一个信道和事件计数器,与主机实际通信的信道对比。确保接入地址、跳频增量、信道映射等参数传输无误。 3. 检查CAN/LIN总线物理连接、波特率配置。在主机和监控器代码中添加调试打印,确认连接参数消息已成功发送和接收。 4. 检查天线是否连接牢固。尝试缩短设备间的距离,排除信号强度问题。 |
| 只能收到主机包,收不到从机包 | GFSK中断处理逻辑有误,在收到主机包后没有正确、快速地重启接收机。 | 仔细检查genfsk_isr.c中关于packetFromMaster标志位处理的逻辑。确保在识别为主机包后,立即执行重启接收的操作(如GENFSK->XCVR_CTRL = 5;),并且没有因超时导致接收流程提前终止。 |
| RSSI值不稳定或明显错误 | 1. 禁用DCOC后,接收机工作点偏移。 2. 多链路切换时,射频前端未稳定。 3. RSSI读取时机不对。 | 1. 尝试启用DCOC校准,看RSSI是否变得稳定。如果必须禁用,考虑在代码中增加一个简单的软件滤波(如滑动平均滤波)处理RSSI值。 2. 在切换信道后,增加一个微秒级的短暂延时,等待射频锁相环和放大器稳定后再开始接收。 3. 确保在数据包完全接收完毕、且芯片的RSSI采样值已更新后再去读取RSSI寄存器。 |
| 多链路监控下丢包率随链路数增加而升高 | 监控器MCU处理不过来,调度策略有缺陷,导致错过某些链路的监听窗口。 | 1. 优化中断服务程序,只做最必要的操作(保存数据、更新标志),将复杂的处理(如跳频计算、协议解析)移到主循环。 2. 审查调度算法。检查为信道切换和射频稳定预留的时间是否足够。如果连接间隔太短,可能硬件上无法支持监控过多链路,需要考虑性能更强的MCU或优化连接参数(在主机端适当增加连接间隔)。 |
| CAN/LIN通信参数传输错误 | 数据结构对齐、字节序(大小端)问题。 | 主机和监控器必须使用完全相同的内存布局结构体来定义参数消息。使用#pragma pack(1)确保结构体单字节对齐。对于多字节字段(如uint32_t的接入地址),明确约定并使用字节序转换函数(如__REV())确保网络字节序一致。 |
6.2 高级优化与扩展思路
- 动态锚点选择:前述方案固定选择第一个连接的设备作为锚点。可以优化为选择连接间隔最短、最稳定的链路作为锚点,这样可以最大化监控器的监听效率,减少空闲等待时间。
- RSSI滤波与距离估计算法:原始的RSSI值噪声很大。可以引入卡尔曼滤波或更简单的移动平均滤波来平滑数据。更进一步,可以建立RSSI与距离的映射模型(需现场校准),让监控器直接输出距离估计值,并与主机测得的距离进行比对,使得中继攻击的判断更加直观和鲁棒。
- 安全报警策略:不要仅凭单次RSSI差异就报警。可以设计一个状态机,例如连续N次监控器RSSI均显著强于主机RSSI(超过阈值X dB),且该差异持续一段时间,才触发最终的中继攻击警报,避免因瞬时干扰造成误报。
- 功耗优化:监控器在知道下一个监听事件的时间点后,可以让MCU和射频部分进入深度睡眠,直到事件临近前再唤醒,从而极大地降低平均功耗,使该方案适用于电池供电的便携设备。
实现基于GFSK的多链路监控来防御BLE中继攻击,是一个将通信协议知识、射频硬件特性和嵌入式软件调度紧密结合的综合性项目。它没有使用高深莫测的密码学,而是从物理层信号这个最基础的维度构筑了一道防线。调试过程虽然繁琐,但当你看到监控器稳定地打印出所有链路的信号强度时,那种对系统底层有了透彻掌控的感觉,是非常棒的。这个方案为汽车进入、工业防拆等需要高安全距离验证的场景,提供了一个极具性价比且可靠的实现路径。
