烟草味道|快速理解Android中的三个蓝牙漏洞( 四 )
漏洞3:Bluetooth SMP smp_sm_event() OOB Array IndexingBluetooth SMP smp_sm_event() OOB阵列索引
简要蓝牙范围内的远程攻击者可以使用Android 蓝牙堆栈中的漏洞 , 通过以意外传输方式将包含SMP_OPCODE_PAIRING_REQ命令的SMP数据包发送到目标设备 , 从而使com.android.bluetooth守护程序访问其边界之外的数组 。
前置介绍安全管理协议SMPSMP(The Security Manager Protocol )
连接建立之后 , 双方通过某些方式协商共同的密钥 , 然后将后续要传输的数据用这个密钥通过加密算法进行加密 , 然后发送 。 接收方 , 接收到这些数据后 , 必须使用正确的密钥来解密 , 才能得到正确的数据了 。 接着 , 建立密钥 , 即完成双方密钥协商 , 就密钥一事达成共同一致的过程 。
过程如图所示:
为运行在低功耗蓝牙协议栈上的应用程序提供诸如身份验证 , 设备授权和数据隐私等服务的权限 。
漏洞详情数组索引只接受0x0和0x1 , 而作为索引的变量还能设置为0xff , 导致后续引用可能导致分段错误
SMP协议通过预定义的L2CAP_SMP_CID(0x06)通道 , 位于L2CAP之上 。
传入的SMP数据包由smp_data_received()函数[ platform / system / bt / stack / smp / smp_l2c.cc ]处理 。 如果 通过包含SMP_OPCODE_PAIRING_REQ(0x01)命令的L2CAP_SMP_CID固定通道 接收到输入SMP数据包 , 则将到达以下代码:
static void smp_data_received(uint16_t channel, const RawAddress[...]如上面的代码所示 , 最后一行中p_cb-> role设置为L2CA_GetBleConnRole(bd_addr)返回的值 。 p_cb-> role应该保存以下值之一[ platform / system / bt / stack / include / hcidefs.h ] , 也就是 p_cb->role的值可以是0x00、0x01、0xff
/* HCI role defenitions */#define HCI_ROLE_MASTER 0x00#define HCI_ROLE_SLAVE 0x01#define HCI_ROLE_UNKNOWN 0xff如果我们查看L2CA_GetBleConnRole()函数的代码[ platform / system / bt / stack / l2cap / l2c_ble.cc ] , 我们可以看到它调用了l2cu_find_lcb_by_bd_addr()为了查找活跃的链接控制块(an active Link Control Block)(LCB)结构匹配远程BDADDR并且使用低能耗传输(BT_TRANSPORT_LE);如果找不到它 , 则返回HCI_ROLE_UNKNOWN(0xff) 。 当我们通过BR/EDR(基本速率/增强数据速率 , 也称为“经典”蓝牙)传输发送包含SMP_OPCODE_PAIRING_REQ命令的SMP数据包时 , 这种情况会发生 , 因为它只适用于低能量(LE)传输:
uint8_t L2CA_GetBleConnRole(const RawAddresstL2C_LCB* p_lcb;p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE);if (p_lcb != NULL) role = p_lcb->link_role;return role;}因此 , 回到smp_data_received()函数 , 将p_cb-> role设置为HCI_ROLE_UNKNOWN(0xff)之后 , 它调用smp_sm_event() [ platform / system / bt / stack / smp / smp_main.cc ] , 我们到达以下代码:
953void smp_sm_event(tSMP_CB* p_cb, tSMP_EVENT event,tSMP_INT_DATA* p_data) {...957tSMP_ENTRY_TBL entry_table = smp_entry_table[p_cb->role];...970/* look up the state table for the current state */971/* lookup entry /w event 因此 , 由于执行entry_table = smp_entry_table [0xff]时的OOB索引 , entry_table局部变量将包含一些垃圾值(无论是否在bluetooth.default.so二进制数据的smp_entry_table全局变量之后) 。 因此 , 稍后 , 在第975行 , 当取消引用entry_table [event- 1] [curr_state]时 , 很可能会导致分段错误(受特定版本的bluetooth.default.so二进制文件的影响 , smp_entry_table全局变量位于该二进制文件中)) , 这将使com.android.bluetooth守护程序停止工作 。
推荐阅读
- 上海市嘉定区人民政府网站|【走向我们的小康生活】日揽300件的“快递一哥”,为了快速送货,他手绘了一张地图
- 上海嘉定|嘉定这8个受理点和受理中心,可申请居住证快速办理(附问答)
- 小郑杰西卡|上演快速瘦身大法,服了,22岁“北境女王”索菲产女后首次亮相
- 烹饪|泡发香菇时加一勺它,泡发的香菇味道更鲜,3分钟香菇全部泡发
- 关节骨头|上班久坐,休息刷手机,不小心含胸驼背,怎样快速唤醒挺拔身姿?
- 综艺节目|严敏新综艺开播,还是那个熟悉的味道,《极限挑战》真的不该放他
- 美军|美媒:中国空军快速发展,五角大楼称美军面临巨大“威胁”
- 环球时评|香港一巴士司机快速行驶贴近执勤警员被截停,因危险驾驶罪被捕
- 青岛警方通报!东西快速路抢道引冲突,出租车司机捅伤网约车司机逃离
- 广东省烟草局局长刘依平表示将安全工作尽在掌握中,推动安全生产管理 - 向“大安全”迈进
