首页 > 其他分享 >如何实现蓝牙配对方法混淆攻击

如何实现蓝牙配对方法混淆攻击

时间:2023-02-23 15:57:36浏览次数:48  
标签:中间人 混淆 发起者 蓝牙 认证 配对 响应者

背景

蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。蓝牙具有无线、短程等特点,主要能够提供设备到设备之间的通信。蓝牙协议目前从最初的1.0版本更新到了5.3版本,并在4.0版本之后分为了经典蓝牙(BC)和低功耗蓝牙(BLE),BLE在保证了BC的大部分性能的情况下最大程度上降低了功耗,因此在如今的更多智能设备中被采用。

原理

低功耗蓝牙配对过程

低功耗蓝牙配对共分为四个步骤:配对信息交换、公钥交换、认证阶段、长期密钥的生成与验证。

配对信息交换

在配对信息交换阶段,将要进行配对的设备会交换配对过程中一些所必须的信息,比如:

  • OOB-bit:表明带外信息是否准备就绪
  • MitM-bit:表明是否需要验证
  • IOCaps:表明待配对设备的输入输出能力

IOCaps一般会表明待配对设备的输入输出能力,具体分为以下六种:

  • DisplayOnly:设备只能显示一个6位数的数字值。
  • DisplayYesNo:设备可以显示一个6位数的数值,用户可以输入确认(是或否)。
  • KeyboardOnly:用户可以输入一个6位数的数字值和一个确认。
  • KeyboardDisplay:设备可以显示一个6位数的数字值,用户可以输入一个6位数的数字值并确认。
  • NoInputNoOutput。设备没有能力与用户通信

根据不同的输入输出能力,认证阶段会采取不同的认证方式。

公钥交换

在完成配对信息交换后,会进入公钥交换阶段,如图1所示。首先发起者I与响应者R会分别选取一个私钥 \(SK_I\) 与 \(SK_R\) ,之后采用 Elliptic Curve Diffie-Hellman (ECDH) 算法加密生成公钥 \(PK_I\) 与 \(PK_R\)。在交换公钥之后,在交换公钥之后,再分别根据自己的私钥计算出相同的 \(DHK\),从而生成相同的密钥。

公钥交换阶段

认证阶段

为了验证交换的公钥是否正确,保证交换过程中没有遭到中间人攻击,目前常用的认证方法共有四种:

  • Just Works(直接工作):密钥未经验证(即未经验证的安全要求)。

  • Out of Band(带外认证):公钥通过独立于蓝牙的反向通道(例如,NFC、二维码)进行验证。

  • Numeric Comparison(数字比较):用户在两台设备上显示一个 6 位数字,必须确认它们是否相等。

  • Passkey Entry(密码输入):用户在一台设备上显示一个 6 位密码,并被要求将其输入另一台设备。

在认证阶段,会根据交换得到的 IOCaps 位,即两个待配对设备的输入输出能力,来采取不同的认证方式,如下图所示。

不同输入输出能力的设备采取不同的认证方式

方法混淆攻击的主要对象是数字比较与密码输入两种方法,下面将详细说明两种认证方法的异同。

数字比较(Numeric Comparison)

首先发起者 \(I\) 与响应者 \(R\) 会分别生成一个设定值 \(ra\) 和 \(rb\)(为0),一个随机值 \(N_I\) 和 \(N_R\)。之后响应者 \(R\) 会用由协议规定的 \(f4\) 算法根据公钥 \(PK_I\) 与 \(PK_R\)、随机值 \(N_R\) 与设定值 \(rb\) 生成一个校验值 \(C_R\),传递给发起者 \(I\),并在交换 \(N_I\) 和 \(N_R\) 后,由发起者进行校验。随后发起者 \(I\) 与响应者 \(R\) 会由公钥 \(PK_I\) 与 \(PK_R\),随机值 \(N_I\) 和 \(N_R\) 哈希出一个六位数字,并在两边的设备上显示,由用户对两个数字进行比较并确认。若确认结果相同,则完成认证,否则认证失败。

Numeric Comparison

下面这个视频演示了数字比较的过程:

<iframe allowfullscreen="true" frameborder="no" scrolling="no" src="https://player.bilibili.com/player.html?cid=1021662292&aid=779803001&page=1&as_wide=1&high_quality=1&danmaku=0" style="position: absolute; width: 100%; height: 100%; left: 0; top: 0"></iframe>

密码输入(Passkey Entry)

首先在发起者 \(I\) 与响应者 \(R\) 会有一方生成一个 20 位密码,并由用户输入到另外一方,双方便获得了相同的设定值 \(ra\) 和 \(rb\)。随后双方会对 \(ra\) 与 \(rb\) 进行逐位检验。具体过程是,对于 \(ra\) 和 \(rb\) 的每一位,发起者 \(I\) 与响应者 \(R\) 会首先生成一个随机值 \(N_I\) 和 \(N_R\)。之后双方会用由协议规定的 \(f4\) 算法根据公钥 \(PK_I\) 与 \(PK_R\)、随机值 \(N_I\) 和 \(N_R\) 生与设定值当前位 \(rai\) 与 \(rbi\) 生成校验值 \(C_I\) 与 \(C_R\),并在交换 \(N_I\) 和 \(N_R\)、\(C_I\) 与 \(C_R\) 后,由双方进行校验。在这个过程循环 20 次,\(ra\) 与 \(rb\) 的每一位都得到校验后,若所有位相同,即完成了密码输入的认证过程,否则认证失败。

Passkey Entry

下面这个视频演示了密码输入的过程:

<iframe allowfullscreen="true" frameborder="no" scrolling="no" src="https://player.bilibili.com/player.html?cid=1021658043&aid=822280855&page=1&as_wide=1&high_quality=1&danmaku=0" style="position: absolute; width: 100%; height: 100%; left: 0; top: 0"></iframe>

长期密钥的生成与验证

在完成验证之后,双方会由协议规定的 \(f5\) 算法根据 \(DHK\),随机值 \(N_I\) 和 \(N_R\),地址 \(addr_I\) 和 \(addr_R\) 生成长期密钥 \(LTK\),\(LTK\) 会作为长期通讯中的加密密钥,有了 \(LTK\) 之后下次两个蓝牙设备之间就无需配对过程:

\[MacKey||LTK=f5(DHK,\ N_I,\ N_R,\ addr_I,\ addr_R) \]

此外,在生成长期密钥后,还会进行最终阶段的验证,如下图所示

最终验证

方法混淆攻击

根据 Initiator 和 Responder 与中间人验证方式的不同,方法混淆攻击分为 PoN 攻击与 NoP 攻击两种,其中 PoN 方法混淆攻击的原理如下图所示。

PoN攻击

首先在配对信息交换阶段,在接收到发起者 \(I\) 的信息后,触发中间人发起者 \(M_I\) 与响应者 \(R\) 进行配对信息交换。注意此时中间人响应者 \(M_R\) 返回给发起者 \(I\) 的 IOCaps 为 DisplayOnly,而中间人发起者 \(M_I\) 发给响应者 \(R\) 的 IOCaps 为 DisplayYesNo,这样便保证了之后在认证阶段中间人响应者 \(M_R\) 与发起者 \(I\) 进行密码输入认证,而中间人发起者 \(M_I\) 与响应者 \(R\) 进行数字比较认证。

之后中间人者 \(M_R\) 与 \(M_I\) 分别与发起者 \(I\) 与响应者 \(R\) 进行公钥交换。完成后首先中间人发起者 \(M_I\) 和响应者 \(R\) 会进行数字比较认证,并在此过程中将比较值传给中间人响应者 \(M_R\), 中间人响应者便会利用这个值与真正的发起者进行密码输入认证。由于所有值都是由中间人传输的,所以双方最终都会认证通过并进入长期密钥的生成与验证阶段,同理,最终验证也会通过。至此,便完成了中间人 \(M_R\) 与 \(M_I\) 与真正的发起者 \(I\) 与响应者 \(R\) 之间的蓝牙配对。NoP 攻击原理和 PoN 类似,唯一的差别就是交换了 Initiator 和 Responder 与中间人的验证方式。

BTstack

BTstack 开源库实现了蓝牙协议栈,它的架构如图7所示。可以看到,BTstack 使用单个 Run Loop 处理应用程序或者蓝牙模块发来的数据包。蓝牙协议栈有 GAP、ATT 和 L2CAP 等多个层级,BTstack 在每个层级处都提供了回调函数,应用程序可以在这些回调函数中处理收到的数据。

BTstack 架构

实验过程

实验配置

为了实现 NoP 攻击,我们准备了 4 个不具备独立 MAC 地址的 CSR 蓝牙加密狗,接着使用 Bluetooth Mac Address Changer 工具修改加密狗的 MAC 地址,使得他们的 MAC 地址各不相同。NoP 攻击框图如下图所示,两个加密狗作为 Initiator\((I)\) 和 Responder\((R)\),另外两个作为 Mitm Responder\((M_R)\) 和 Mitm Initiator\((M_I)\),其中 \(I\) 与 \(M_R\)、\(R\) 与 \(M_I\) 之间通过蓝牙进行通信,\(M_R\) 与 \(M_I\) 之间使用管道进行进程间通信。

NoP 攻击框图

实验一开始,启动Responder进程,向外界广播ADV_IND帧,表明自己处于可连接的状态。接着启动 \(M_R\) 与 \(M_I\) 父子进程,其中 \(M_R\) 的蓝牙名和 \(R\) 保持一致,这样 Initiator 就可能错误地将 \(M_R\) 当做 \(R\) 而与中间人进行连接。图下图所示,手机蓝牙的可用设备中有两个名为 CARDREADER 的蓝牙设备,Initiator 无法辨别出哪个是 \(R\) 那个是 \(M_R\)。

蓝牙设备列表

配对过程

  1. \(I\) 与 \(M_R\) 建立连接,触发 HCI_EVENT,BTstack 创建类型为 HCI_EVENT_LE_META类型的 packet 并调用 \(M_R\) 的 responder_sm_packet_handler 回调函数,这个回调函数用来处理与加密连接配对相关的数据包;
  2. responder_sm_packet_handler 回调函数中将启动 \(M_I\) 与 \(R\) 的连接的消息写入管道;
  3. \(M_I\) 监听到管道中有让自己与 \(R\) 进行连接的消息,就立即与 \(R\) 建立连接,并接着等待 \(M_R\) 给自己发过来 \(V_a\);
  4. \(M_R\) 将计算出的 \(V_a\) 写入管道;
  5. \(M_I\) 收到管道中传来的 \(V_a\),完成与 \(R\) 之间的 Passkey Entry 验证过程

通信过程

  1. \(I\) 通过蓝牙模块发送消息给 \(M_R\);
  2. \(M_R\) 收到消息,触发 l2cap_mitm_responder_packet_handler 回调函数,这个回调函数用来处理 L2CAP 层的数据包;
  3. l2cap_mitm_responder_packet_handler 中识别到 packet 类型为 L2CAP_DATA_PACKET,将 packet 的数据拷贝到缓冲区中,此时也可以直接修改缓冲区的数据为中间人想要的消息;
  4. BTStack 的 Run Loop 的每次循环都会调用 forward_packet 函数,在这个函数中 \(M_R\) 将缓冲区的数据写入管道;
  5. \(M_I\) 在 forward_packet 函数中将管道的数据拷贝到缓冲区,接着转发给 \(R\)

实验结果

NoP攻击结果如下述视频,Initiator 发送的原始消息“硝子真可爱”被中间人截获,并被修改为“我家硝子真可爱”后转发给 Responder,此时 Responder 收到的就是修改后的消息。

<iframe allowfullscreen="true" frameborder="no" scrolling="no" src="https://player.bilibili.com/player.html?cid=1021664196&aid=567340554&page=1&as_wide=1&high_quality=1&danmaku=0" style="position: absolute; width: 100%; height: 100%; left: 0; top: 0"></iframe>

总结

在本文中,我们复现了蓝牙配对方法混淆攻击,该攻击方式利用蓝牙配对过程中设备不会确认双方实际使用的认证方式是否相同的漏洞,成功实现了发起者和响应者的双向欺骗。该攻击方式被提出之后,部分手机厂商(如华为)在蓝牙配对的确认环节会弹出提示框,要求设备使用者仔细核对认证方式是否相同,这在一定程度上可以减少方法混淆攻击的危害性,但治标不治本,要想彻底杜绝方法混淆攻击的危害,需要对蓝牙协议打上补丁。

标签:中间人,混淆,发起者,蓝牙,认证,配对,响应者
From: https://www.cnblogs.com/zhiyiYo/p/17148279.html

相关文章

  • python混淆矩阵可视化【热力图】
    依赖包seaborn 和 matplotlib 已经提供了很多种绘制方法了,后文各种方法都是围绕着这个进行的importitertoolsimportnumpyasnpimportpandasaspdimportsea......
  • NRF52840-QIAA-R Nordic BLE5.0蓝牙无线收发芯片
    nRF52840相对于nRF52832具有更大的flash及ram,片内集成1MBflash,256kBRAM。支持蓝牙5.0,802.15.4,ANT及2.4GHz私有协议,同时与nRF51及nRF24系列兼容。nRF52840供电范围为1.7V......
  • 蓝牙、WIFI、5G、窄带物联网的无线通信技术有哪些?
    无线通信模块是智能终端接入物联网的核心,让各终端设备接入物联网获得信息传输能力,将物与物之间联系起来。它连接物联网感知层和应用层,感知层终端设备产生的数据通过无线通信......
  • 对JS代码中的每个函数单独进行混淆加密
    自动化脚本:单独对JS代码中的每个函数进行混淆加密用自动化脚本工具,对JS代码中的每个函数分别进行单独混淆加密。这样加密得到的JS代码,比直接对整个JS代码进行混淆加密,效果要......
  • 利用unicorn模拟执行去除ollvm混淆
    去混淆思路先找到函数中所有的基本块确定状态变量是保存在宿主寄存器中还是栈中(局部变量)观察判断控制块的特点,将所有控制块剔除。剔除之后基本块中还包含真实块和虚假......
  • 【Bluetooth开发】一、蓝牙开发入门详解
     ​编辑BLE蓝牙设备在生活中无处不在,但是我们也只是将其作为蓝牙模块进行使用,发送简单的AT命令实现数据收发。那么,像对于一些复杂的使用场合:“车载蓝牙”、"智能手表"、“......
  • 蓝牙5.0对物联网应用的影响
    多年来,蓝牙一直在革新无线技术。其最新的5.0版本提供了显着改进的体验——明显更快的速度、更大的范围和广泛的数据广播功能,所有这些都大大扩大了其市场潜力。其使设备配对......
  • PHY6230— 高性价比的低功耗高性能蓝牙5.2芯片
    高性价比的低功耗高性能蓝牙5.2系统级芯片,适用多种PC/手机外设连接场景。高性能多模射频收发机:通过硬件模块的充分复用实现高性能多模数字收发机。发射机,最大发射功率10d......
  • Cordova 使用 cordova-plugin-ble-central 蓝牙插件,实现蓝牙设备持续扫描,打印RSSI等信
    目录前言代码下载版本更新效果图完整演示动图主界面效果页核心代码index.jsindex.htnl 前言算法讲解:RSSI平面三点定位算法(C语言、JS源码例程......
  • 记录--『uni-app、小程序』蓝牙连接、读写数据全过程
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助本文简介这是一次真实的蓝牙收发数据的全过程讲解。本文使用uni-app+Vue3的方式进行开发,以手机app......