android 9 蓝牙源码_CVE-2017-13258 Android 蓝牙BNEP漏洞分析

本文为看雪论坛优秀文章

看雪论坛作者ID:ID蝴蝶

1、概述

三月份的Android安全公告中披露了多个蓝牙方面的系统层漏洞,漏洞多出现在BNEP中,涉及的源码版本为5.1.1, 6.0, 6.0.1, 7.0, 7.1.1, 7.1.2, 8.0, 8.1,覆盖范围较广。本文以CVE-2017-13258漏洞为例进行分析,该漏洞类型为内存信息泄露,危害等级为High。

2、协议简介

>>>>2.1 介绍

BNEP(Bluetooth Network Encapsulation Protocol)为蓝牙网络封装协议。BNEP将多种通过蓝牙L2CAP(逻辑链路控制与适配协议)传输的网络协议数据包进行封装处理。L2CAP为蓝牙提供数据链路层。BNEP被用于通过蓝牙来传输控制和数据包以此为蓝牙设备提供联网功能。BNEP提供的功能类似于以太网(EthernetII/DIX/Framing /IEEE 802.3)提供的。

>>>>2.2 协议栈

如下图所示:

466151a3819556cb367f2b80324035d0.png

>>>>2.3 BNEP头部格式

所有的BNEP 头部格式都遵从下图所描述的格式。所有支持BNEP的设备必须具备能够解析定义好的BNEP包类型的能力。

支持BNEP的设备有可能会处理压缩的BNEP头部,也有可能不会。任何包含保留的BNEP头数据包类型的数据包必须下放到处理扩展头部的过程中进行处理。

e171a3c17496796e3d67a00f1e26e27e.png

前一个字节中,BNEP Type大小为7bit,Extension Flag 为 1 bit。BNEP Type的值如下图所示。

0c11666581402a7fc5c8da4f8e3c5528.png

BNEP Type的value设置为0x01,也即是BNEP_CONTROL,属于控制包。E标志置0表示BNEP头部后面紧跟着就是Payload,置1表示BNEP头部后面是扩展头部,需要进一步解析。

由于本案例中触发漏洞的数据包是控制包,这里就直接讲解BNEP_CONTROL包的格式。BNEP_CONTROL包是用来交换控制信息,包格式如下图所示。

d38fa02eb462eeb589457e7d5dd7e07e.png

从8到15位属于BNEP Control Type域,占一个字节大小。BNEP Control Type分为多种,具体值如下图所示。

9ca32cd1dbe18c450d6df162e9b013f8.png

BNEP Contrl Type值为0x00表示BNEP_CONTROL_COMMAND_NOT_UNDERSTOOD类型。大致理解为该控制包发送的控制指令无法被解析或理解。该数据包最终格式如下图所示:

c9da134c3e48042a64b298dd188834ab.png

最后再简单提一下扩展包格式。我们前面讲到,只要是E 标志位被置1后,BNEP头部后面紧跟着就是扩展包头部。扩展包格式如下图所示。

29ceda22118f4888d347b70171879bd3.png

前一个字节依然是类型,第二个字节是扩展包长度,后面从第三个字节开始就是扩展包载荷。这里的Extension Type取值如下图所示。

359f5c1d14296b5625dfe35ef9b9cf55.png

Extension Type取值为0x00表示BNEP_EXTENSION_CONTROL。这里需要表明一下,BNEP_EXTENSION_CONTROL数据包类型头和BNEP_CONTROL数据包类型头可以互换使用。

3、漏洞原理

该漏洞出现在bnep_data_ind函数中,当从L2CAP层接收到数据时,该函数被调用。文件路径为systembtstackbnepbnep_main.c。本文以8.0.0_r4版本为例。

56e0845d02a1cd2863c2492e149a7b4d.png

p_buf指针指向的一个BT_HDR数据块,行434,计算存放数据包的地址,p指向数据包起始地址。BT_HDR结构体如下所示:

bdbc1fbe68b54134e50e2103469d8971.png

Len存放数据包的长度,offset存放偏移地址,用于计算数据包的起始地址。接着向下分析。

c50ffa594e0391c56e986ec4b225fa85.png

行450,取TYPE,然后p跳过一个字节。行451,计算E标志位。行453,判断数据包长度, 最小值不能小于头部长度和最大值不能大于BNEP的MTU值。然后数据包长度减一。

ee3cd6e53382687c7b3d8e5ef437a475.png

行469,如果E标志位为真,就进入扩展头解析。行481,取扩展头的E标志位,行482,取扩展包包含的payload长度,这个长度不包括头部域和长度域的两个字节。这个length域是用户可控的。行483,p指针跳过第一个扩展包的payload数据域,指向下一个数据包。

行485,判断没有下一个扩展包并且发送的BNEP_CONTROL_TYPE不属于已有定义类型,进入bnep_send_command_not_understood(p_bcb,*p),该函数是将错误指令回写到数据包中,并返给客户端。如下图所示。

3f745b5c2c1b1a27d095a038bac6c233.png

根据以上分析,就可以构造特定数据包绕过检测进行内存信息泄漏。

4、漏洞复现

Exploit-db网站已经发布了利用代码,链接地址在文末。关键利用代码,如下图所示。

f8f114bf053d979c6e0a9469391de68a.png

在刷入版本8.0AOSP的nexus5x上测试,结果如下图所示。

bb04eaca1739be338c5baa25206d9537.png

5、漏洞调试

在bnep_data_ind函数上下断点。如下图所示。

a1512bf7ef02cce1c40d7fe2dd5971ba.png

执行利用代码,命中断点后。打印相关数据,如下图所示:

38a1c905e6e1219d90d58b0aed04a566.png
地址0x7a408d8a58为存放数据包的地址。执行到行486处,即将写入返回数据。X1寄存器存放着泄漏的数据,该值为0xc9。如下图所示。

af17d5d8da299527c11be383c66bc367.png

从0x7a408d8a58开始,跳过三字节数据包头部,跳过扩展包一个字节的payload,0x7a408d8a5c处的0xc9作为Unknown Control Type返回给客户端。结束。

调试过程的一些小tips:
Cat /proc/`pid`/maps |
grep bluetooth.default.so 确定调用的so是32位还是64位。以免gdbclient挂载不上。
prebuilts/misc/android-arm64/gdbserver64 推到手机里面
Adb root
adb remount 重新挂在文件系统。
 Cp /sdcard/gdbserver64 /system/bin/
 
Gdbclient `pid`
 
Info sharedlibrary 查看加载模块,找基地址。
 list bnep_data_ind 直接列出函数
计算函数偏移:
lib_start_addr + 相对虚拟地址(虚拟地址-区段起始地址),

相关链接:https://www.exploit-db.com/exploits/44326/http://grouper.ieee.org/groups/802/15/Bluetooth/BNEP.pdf

3072bec6f7503a5fb375457cf0c3b73e.gif

707b9a8f6610a971e41c6417b00536c2.png

- End -

看雪ID:ID蝴蝶

https://bbs.pediy.com/user-611407.htm

*本文由看雪论坛 ID蝴蝶 原创,转载请注明来自看雪社区

推荐文章++++

* 动态过DSE代码以及原理

* ollvm源码分析 - Pass之SplitBaiscBlocks

* Linux内核驱动调试遇到的一些坑以及解决方法(新手必看指南)

* 记一起 kthroltlds 挖矿蠕虫变种分析

* Metasploit后门以及跨平台后门生成

3c818cda162dece4c0ce46bd754adf60.png
ble audio补丁原理是利用hidraw节点捕捉协议栈发送的语音数据,目前Android Blueroid将ble语音数据和按键信息通过hid发送出去,通过建立hidraw节点,可以从中捕捉到语音数据。目前通过ble hal实现从hidraw中读取遥控器语音数据,在Android框架层上就通过配置文件将ble hal导入到音频框架中,并通过绑定Android原生已有的耳麦设备来完成audio音频策略选择,通过apk检测ble连接状态,通知audio服务耳麦设备的状态就可以使得录音通路切换至ble hal,实现从ble获取录音数据功能。 打补丁前最好使用干净的环境,不要有别家方案ble补丁,否则可能会有不兼容问题。 补丁如若不能使用首先检查节点是否存在和其权限,正常节点权限如下: ls -l /dev/hidraw* crw-rw---- 1 system audio 241, 0 2018-12-18 13:42 /dev/hidraw0 audio用户组有读写权限。 2、如果selinux模式为Enforcing,可以通过logcat搜索avc关键字。有如下类似提示则为异常,提示进程没有权限,检查sepolicy是否设置正常: avc: denied { read } for name="/" dev="tmpfs" ino=6145 scontext=u:r:mediaserver:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0 //Android 5.0和6.0版本,audio hal被mediaserver进程加载 avc: denied { read } for name="/" dev="tmpfs" ino=8125 scontext=u:r:audioserver:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0 //Android 7.0版本,audio hal被audioserver进程加载 avc: denied { read } for name="hidraw" dev="sysfs" ino=16332 scontext=u:r:hal_audio_default:s0 tcontext=u:object_r:sysfs:s0 tclass=dir permissive=0 //Android 8.0和9.0版本,audio hal被android.hardware.audio@2.0-service进程加载 3、检查audio的配置,打上patch后,首先确认小机上文件是否有修改到,目前文件可能位于/vendor/etc或/system/etc目录下,其中/vendor/etc下的配置文件是优先解析的。确保文件无误后,通过dumpsys media.audio_policy查看ble hal是否正常加载。 以下是相关说明: AudioPolicyManager: 0xf20c5200 Command Thread: 0xf20af140 Tones Thread: 0xf20af020 ... - Available input devices: Device 1: - id: 3 - type: AUDIO_DEVICE_IN_BUILTIN_MIC - Profiles: Profile 0: - format: AUDIO_FORMAT_PCM_16_BIT - sampling rates:8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 - channel masks:0x000c, 0x0010 Device 2: - id: 20 - type: AUDIO_DEVICE_IN_WIRED_HEADSET //对应的数值是0x80000010 - name: RemoteDM1204 - Profiles: Available input devices指示当前可用设备,目前ble hal是和AUDIO_DEVICE_IN_WIRED_HEADSET设备绑定,如果需要录音走ble hal,AUDIO_DEVICE_IN_WIRED_HEADSET设备必须出现在可用设备中,如果没有,就可能是补丁中hidaudio.apk的问题。 HW Modules dump: ... - H
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值