android蓝牙固件,BlueFrag:Android 蓝牙零交互远程代码执行漏洞分析

如今,蓝牙已成为移动设备不可或缺的一部分,智能手机与智能手表和无线耳机互连。默认情况下,大多数设备都配置为接受来自附近任何未经身份验证的设备的蓝牙连接,蓝牙数据包由蓝牙芯片(也称为控制器)处理,然后传递到主机(Android,Linux等),芯片上的固件和主机蓝牙子系统都是远程代码执行(RCE)攻击的目标。

大多数经典蓝牙实现中可用的一项函数是通过蓝牙ping应答,攻击者只需知道设备的蓝牙地址即可。即使无法发现目标,如果目标被寻址,它通常也会接受连接。例如,攻击者可以运行l2ping,后者会建立L2CAP连接并将回显请求发送到远程目标。

在下文中,我们描述了针对Android 9的蓝牙零点击短距离RCE攻击,该漏洞被分配了CVE-2020-0022。我们已完成在Samsung Galaxy S10e上建立远程shell所需的所有步骤,在2019年11月3日报告此漏洞时使用最新的Android 9,该漏洞利用的漏洞仍然存在于Android中10,但我们利用了Bionic(Android的libc实现)中的另一个bug ,这使得利用方式更加容易。该漏洞最终在A-143894715中的1.2.2020版本的安全补丁中得到修复。

这是PoC的演示:

04cd833b881a467bc2a18f95be68b900.png

9df279ae22ebd8f4bd9130539d92a180.png

87ae5e608f35affcb569b9094a9d43f4.png

dbf8a47036c18431e79da121e1c2b055.png

https://www.youtube.com/watch?v=lrZnZNyEqFg&feature=youtu.be

0x01 准备工作

在InternalBlue和Frankenstein上有一些对Braodcom蓝牙固件的研究。InternalBlue最初是由Dennis Mantz编写的,它与固件交互可以添加调试函数,在该项目中,完成了许多逆向工作对固件的详细信息进行了梳理。

c80d7c1f5d6d47195e29ba12b91189ad.png

为了进行进一步的分析,我们编译了Frankenstein,可以模拟固件进行Fuzzing,要实现固件仿真,必不可少的部分是了解Bluetooth Core Scheduler(BCS)。该组件非常重要,因为它还可以处理数据包和Payload头,并管理时间紧迫的任务。有些低级函数无法从主机访问,甚至无法在固件本身的线程组件内访问,通过访问BCS,我们甚至能够将原始无线帧注入到仿真固件中。

用Frankenstein进行Fuzzing时,我们重点研究了配对之前出现的漏洞。在协议的这些部分中,我们发现了两个漏洞,一个是经典蓝牙漏洞,另一个是低功耗蓝牙(BLE)漏洞。第一个堆溢出是在处理蓝牙扫描结果(EIR数据包)时,影响了编译日期在2010 -2018年之间的固件,甚至更老的固件可能也会受影响(CVE-2019-11516)。为此,我们于2019年4月向Broadcom提供了完整的RCE概念证明(PoC)。报告发布后,Broadcom声称他们知道此漏洞,实际上,最新的Samsung Galaxy S10e有一个补丁程序。自蓝牙4.2之后,第二个堆溢出会影响所有BLE数据包数据单元(PDU),我们于2019年6月向Broadcom提供了PoC,该PoC会破坏堆栈。据我们所知,该漏洞截至2020年2月尚未修复。

在研究PoC以及如何将大量数据放入堆中的思路时,我们还研究了经典的蓝牙异步连接(ACL)数据包。这些主要用于数据传输,例如音乐流,网络共享或更一般的L2CAP。在固件内,ACL处理相对简单,有很多更复杂的处理程序和专有协议扩展,例如,Jiska Classen发现了链接管理协议(LMP)类型混淆漏洞(CVE-2018-19860)。

0x02 Fuzz ACL

这篇文章中描述的漏洞是在ACL中触发的。我们通过对数据包和有效载荷报头执行位翻转来Fuzzing此协议。通过将固件bcs_dmaRxEnable挂在固件中来实现初始Fuzzer,该函数由BCS ACL任务调用。bcs_dmaRxEnable将无线帧复制到发送缓冲区。在执行此函数之前,数据包和有效载荷报头已被写入相应的硬件寄存器,因此,我们能够在传输之前修改完整的数据包,从而在固件中编译一个简单的蓝牙Fuzzer。

2e69a93f3b832be4b102acfbf92ab997.png

在初始设置中,我们通过无线方式在Linux主机上对Android设备进行l2ping操作,并且蓝牙固件Fuzzer随机将标头中的位翻转。当我们尝试使Android设备的固件Crash时,Android Bluetooth守护程序Crash了。在日志中,我们观察到一些Crash报告,如下所示:

pid: 14808, tid: 14858, name: HwBinder:14808_ >>> com.android.bluetooth <<<

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x79cde00000

x0 00000079d18360e1 x1 00000079cddfffcb x2 fffffffffff385ef x3 00000079d18fda60

x4 00000079cdd3860a x5 00000079d18360df x6 0000000000000000 x7 0000000000000000

x8 0000000000000000 x9 0000000000000000 x10 0000000000000000 x11 0000000000000000

x12 0000000000000000 x13 0000000000000000 x14 ffffffffffffffff x15 2610312e00000000

x16 00000079bf1a02b8 x17 0000007a5891dcb0 x18 00000079bd818fda x19 00000079cdd38600

x20 00000079d1836000 x21 0000000000000097 x22 00000000000000db x23 00000079bd81a588

x24 00000079bd819c60 x25 00000079bd81a588

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值