首页 > 其他分享 >CVE-2020-0022 蓝牙漏洞复现

CVE-2020-0022 蓝牙漏洞复现

时间:2023-10-30 23:33:05浏览次数:36  
标签:0022 HCI partial 蓝牙 packet L2CAP 2020 CVE 数据包

CVE-2020-0022

参考连接:
CVE-2020-0022 蓝牙漏洞初探(上)一个bug引发的血案-安全客 - 安全资讯平台 (anquanke.com)
CVE-2020-0022 “BlueFrag”漏洞分析 (bestwing.me)
Diff - 3cb7149d8fed2d7d77ceaa95bf845224c4db3baf^! - platform/system/bt - Git at Google (googlesource.com)
个人学习记录,参考很多前辈的文章。如果有错误,请指出,我将不胜感激。

一、 环境搭建

受害机器:Nexus 5X + Android 7.1.2
攻击机器:Ubuntu + 外接蓝牙适配器

二、 漏洞分析

HCI与L2CAP介绍

​ 在手机、笔记本电脑等设备中,蓝牙的结构一般是分为host和controller,controller也就是蓝牙芯片。两个设备之间通过hci层来进行数据的传递。如下图:

image-20230512153117419

image-20230529134510819

CVE-2020-0022漏洞位于HCI层,漏洞补丁代码位于hci/src/packet_fragmenter.cc中的reassemble_and_dispatch()函数中,该函数是用于数据包分片的重组。

​ L2CAP层是HCI层的上层,可以将L2CAP协议类比为网络中的TCP/UDP协议,实现了更为完善的数据传输功能。

  • 在发送路径上,上不同的上层协议层传输给L2CAP的数据统称为SDU(Service Data Unit)。SDU的最大长度可达65536字节,当较大的SDU其进入L2CAP层后,则会触发分段(Segmentation),得到多个较小的数据片段,L2CAP层对每个片段添加L2CAP协议头,封装为PDU数据包并传递至HCI层。当单个PDU进入HCI层,若其大小超过HCI层的限定,则触发分解(Fragmentation),再对得到的每块碎片数据分别添加HCI头,并依次发送至蓝牙控制器。
  • 在接收路径上,相应地,对于蓝牙控制器收到的多个HCI数据包,HCI层需要对其进行重组(与分解对应),得到PDU传递给L2CAP层;类似地,L2CAP层需要对多个PDU进行重组(与分段对应),得到SDU传递给上层协议层。
  • 在蓝牙核心规范中,HCI ACL数据包的格式如下

image-20230512162958580

​ 其中,PB Flag是Packet Boundary Flag的缩写,该字段占用两个bit:

当其数值为00或10时,表征当前HCI包是上层L2CAP PDU分解所得碎片中的首包;

当其数值为01时,表征当前HCI包是上层L2CAP PDU分解所得碎片中的续包;

当其值为11时,表征其封装了一个完整的上层L2CAP PDU。

​ 在蓝牙核心规范中,普通有连接的L2CAP 包的格式如下 (参考L2CAP数据包)

image-20230512172845218

注:Length字段不包括Basic L2CAP header的长度

漏洞代码分析

  • CVE-2020-0022漏洞位于HCI层,漏洞补丁代码位于hci/src/packet_fragmenter.cc(以7.1.2_r1为例)packet_fragmenter.c - Android Code Search 中的reassemble_and_dispatch()函数中,该函数是用于数据包分片的重组。对于过长的ACL数据包需要进行包的重组。
  1. 首先该函数从stream中读取一些信息并且设置了一些变量:
    • l2cap_length:整个l2cap数据包的数据部分的长度
    • acl_length:整个数据包的长度
    • HCI_ACL_PREAMBLE_SIZE:是固定值4字节
    • boundary_flag:是从数据包中读取了分段标记,PB的值
      • PB FLAGS == 00(bit) 时,代表 Host -> Contoller 的 L2CAP 的首包
      • PB FLAGS == 10(bit) 时,代表 Contoller -> Host 的 L2CAP 的首包
      • PB FLAGS == 01(bit) 时,代表 Host -> Contoller 或者 Contoller -> Host 的 L2CAP 的续包
  2. 当读取道boundary_flag是10(10是二进制,也就是十进制的2)的时候,进入首包的处理逻辑:
    • 需要注意full_length代表的是组装完全的数据包的长度,可能传入的时候是分包的,第一个包的长度不等于full_length
  3. 接下来有一些错误处理掠过,如果条件全部满足,则会创建一个partial_packet来处理数据包:
    • 数据包拼接的结果就会放在这个partial_packet中,所以他的长度已经被提前设置为full_length了,拼接全部完成之后这个partial_packet的长度就会等于full_length
    • 其中还要关注offset,offset就是偏移的意思,就是标记数据包处理到了哪个位置
    • 如果是分包中的首包的话,就直接拼接道partial_packet就可以了,后续的包的处理就是把data部分截出来,拼接道partial_packet中。这里这个memcpy就是首包的拼接。

帮助理解的图

  1. 后续包的处理逻辑 (漏洞位置)
    • 首先关注projected_offset的计算是 partial_packet已经处理到的位置 + 目前这个包的数据部分。实际上projected_offset就等于拼接上现在这个包的数据部分后,这个partial_packet的长度。
    • 根据partial_packet的长度的定义可以知道,正常来说,全部拼接完成之后,长度也不会超过一开始设置的full_length,也就是partial_packet->len。
    • 所以下方有一个逻辑判断,projected_offset有没有大于partial_packet->len,如果大于了,就意味着拼接完的包,比最开始说好的长度要长,那么肯定是出了问题。
    • 下面的处理逻辑就是将目前packet的长度修正,将多余的部分减去。将projected_offset也修正,让他等于全部拼接完成后的数据包的长度。
    • 后面再开始本次数据包的拼接,然而问题在于packet->len - packet->offset这里。packet->offset是常量4,那么如果packet->len的值小于4就会出现负数的情况,memcpy函数中没有负数的概念,-1-2这种负数由于补码就会变成极大值,最终导致溢出。漏洞就出现在这里
    • 再去查看上面packet->len的修复逻辑是,partial_packet->len - partial_packet->offset,实际上等于下图的橙色部分。只要让这一部分小于4就会产生漏洞。也就是让发送的数据包正好需要分包。比如说1024个字节之后需要分包,那么就发送1026个字节,分包的同时也可以让橙色部分等于2

三、 漏洞复现

leommxj/cve-2020-0022: poc for cve-2020-0022 (github.com)
image-20230511152354363

标签:0022,HCI,partial,蓝牙,packet,L2CAP,2020,CVE,数据包
From: https://www.cnblogs.com/d3solate/p/17799224.html

相关文章

  • [CSP-S2020] 儒略日 题解
    [CSP-S2020]儒略日今儿终于做掉困扰多年的题目了,其实想好细节也不难。容易发现儒略历和格里高利历的润年判断方式不一样,并且中间有消失的十天,计算起来相当不方便。所以我们可以首先计算出\(-4713.1.1\)~\(1582.10.4\)会经过多少天,可以通过一天一天暴力跳的方法计算出需要\(......
  • WebStorm 2020下载_WebStorm 2020官方下载 中文版介绍
    webstorm最新版功能1、支持corepack,这是一个实验性的节点js工具;2、允许您在不安装的情况下使用yarn和pnpm;3、webpack编码帮助将使用webpack.config;4、允许您通过单击命令左侧的run图标直接从文件运行这些命令;5、提供列表创建和下拉菜单,允许您选择标题样式,容易格式化md文件。软件地......
  • [WUSTCTF2020]alison_likes_jojo
    boki图片中有隐藏文件压缩包需要密码暴力破解出密码888866解压得到信息经过三次base64解码后得到信息得到密码,这是另一张图片outguess隐写的密码,之后到虚拟机中进行破解得到flagflag{pretty_girl_alison_likes_jojo}......
  • CVer从0入门NLP(一)———词向量与RNN模型
    ......
  • 去上海出庭:因用户2020年转载一篇公众号文章被起诉
    10月30日10:30,因用户2020年转载一篇公众号文章而产生的信息网络传播权纠纷一案将在上海市宝山区人民法院开庭,我们将去上海出庭,亲眼目睹原告如何振振有词地在法庭上表演。我们原本准备最近注销上海的公司,专心在杭州运营,没想到会以这样的方式与上海告别:2位上海的自媒体个人,通过同......
  • Photoshop 2020 中文免费版下载含安装包
    AdobePhotoshopCC中文版除去PhotoshopCS6中所包涵的功能,PhotoshopCC还新增相机防抖动、CameraRAW功能改进、图像提升采样、属性面板改进、Behance集成等等功能。adobephotoshopcc2020拥有智能型锐利化、智能型增加取样、3D场景面板、建立晕映效果、修图、水印、羽化等等功......
  • 「联合省选 2020 A」组合数问题 题解
    非常显然的,我们展开\(f(k)\),于是有:\[\begin{align}&\sum\limits_{k=0}^{n}\sum\limits_{i=0}^{m}a_{i}k^{i}x^{k}\binom{n}{k}\\=&\sum\limits_{k=0}^{n}\sum\limits_{i=0}^{m}a_{i}{\sum\limits_{j=0}^{i}\begin{Bmatrix}i\\j\end{Bmatrix}\binom{......
  • Log4J2漏洞(CVE-2021-44228)原理
    Log4J2漏洞(CVE-2021-44228)原理一、漏洞简介ApacheLog4j2是一个基于Java的日志记录工具,当前被广泛应用于业务系统开发,开发者可以利用该工具将程序的输入输出信息进行日志记录。2021年11月24日,阿里云安全团队向Apache官方报告了ApacheLog4j2远程代码执行漏洞。该漏洞是由于A......
  • 施乐DocuCentre SC2020扫描功能的配置和使用
    目录0前言1配置静态IP登录到路由器管理后台查询IP地址配置静态IP2配置FTPServer下载FileZillaServer安装FileZillaServer登录FileZillaServer配置FileZillaServer3配置Windows防火墙4验证FTP服务使用浏览器进行测试.使用P......
  • GB/T 39412-2020《信息安全技术 代码安全审计规范》解析
    ​代码审计标准GB/T39412-2020《信息安全技术代码安全审计规范》是中国国家标准之一,旨在规范信息安全技术领域中代码安全审计的相关流程、技术和方法。该标准适用于指导代码安全审计相关工作,旨在帮助相关安全审计人员更好地识别和评估代码中的安全缺陷,提高软件系统的安全性。......