Linux内核蓝牙协议栈误差(BleedingTooth)使用剖析与复现

宣布时间 2021-04-16

误差概述


2020年10月,谷歌清静研究职员披露了三个Linux内核蓝牙协议栈误差,可导致远程代码执行,被称为BleedingTooth 。这三个误差中,一个是堆溢出,编号为CVE-2020-24490;另一个是类型混淆,编号为CVE-2020-12351,最后一个是信息泄露,编号为CVE-2020-12352 。克日,谷歌清静研究职员又披露了BleedingTooth中CVE-2020-12351和CVE-2020-12352组合的误差使用及细节,并在蓝牙4.0下,实现了零点击远程代码执行 。


误差剖析


CVE-2020-12351


该误差泛起在net/bluetooth/l2cap_core.c中 。l2cap_recv_frame()是剖析和处置惩罚l2cap协议数据包的函数 。代码实现如下所示:


1.png


获取通道cid和l2cap数据包长度len 。代码实现如下所示:


2.png


凭证差别的通道cid,进入差别的子历程举行处置惩罚,进入l2cap_data_channel()函数 。代码实现如下所示:


3.png


首先,通过cid找到通道chan;若是没有找到,判断cid是否为L2CAP_CID_A2MP;若是是,挪用a2mp_channel_create()建设一个新的通道chan 。a2mp_channel_create()函数实现如下所示:


4.png


挪用amp_mgr_create()建设mgr,在amp_mgr_create()函数中,代码实现如下所示:


5.png


挪用a2mp_chan_open()建设通道chan,该函数将初始化一部分数据,代码实现如下所示:


6.png


如将chan->mode初始化为L2CAP_MODE_ERTM 。chan->data赋值为mgr,类型为struct amp_mgr 。乐成建设a2mp通道返回到l2cap_data_channel()中,代码实现如下所示:


7.png


凭证chan->mode的差别,进入差别的data处置惩罚子历程,当mode为L2CAP_MODE_ERTM和L2CAP_MODE_STREAMING时,进入l2cap_data_rcv()函数中,代码实现如下所示:


8.png


该if条件中,会挪用sk_filter()函数,此时chan->data为参数 。而sk_filter()函数界说如下所示:


9.png


第一个参数类型为struct sock,而chan->data类型为struct amp_mgr,爆发类型混淆 。


CVE-2020-12352


该误差是泛起在a2mp协议中,误差代码位于net/bluetooth/a2mp.c,多个函数使用未初始化的结构体,将数据返回到用户层,导致信息泄露,可泄露内核栈上的内存数据 。误差原理较为简朴,以a2mp_getinfo_req()函数为例,该函数是响应getinfo请求时挪用的,代码实现如下所示:


10.png


行304,通过req->id获取hdev,若是不保存hdev或hdev->type不是HCI_AMP,进入if语句中,界说struct a2mp_info_rsp类型的 rsp,该结构体界说如下所示:


11.png


其只使用了rsp.id和rsp.status,其他的数据域未使用也未初始化,可以泄露16字节数据,然后挪用a2mp_send()函数将响应包发送到用户层,泄露内存数据 。


CVE-2020-24490


该误差只能在bluetooth 5.0下触发,在bluetooth 5.0之前,HCI举行广播的最大数据长度为0x1F,0x20-0xFF保存 。如下所示:


12.png


在bluetooth 5.0中,该length最大扩展到229字节 。如下所示:


13.png


该误差代码位于net/bluetooth/hci_event.c中,在处置惩罚HCI_LE_Extended_Advertising_Report事务中,未判断广播数据长度最大值,后续拷贝广播Data导致溢出 。挪用历程如下所示:


14.png


process_adv_report()函数处置惩罚广播数据,将广播数据拷贝到发明的装备中,代码实现如下所示:


15.png


挪用store_pending_adv_report()函数,该函数实现广播数据拷贝,代码实现如下所示:


16.png


其中,discovery_state结构体界说如下所示:


17.png


last_adv_data数据巨细为HCI_MAX_AD_LENGTH,共31字节,当执行memcpy时爆发溢出 。


使用剖析与复现


控制代码执行流程


前文剖析到CVE-2020-12351类型混淆是在sk_filter()函数中爆发的,sk_filter()函数挪用sk_filter_trim_cap()函数,该函数代码实现如下:


18.png


该函数第一个参数为sk,参数类型为sock结构体,这部分代码中对sk和skb的检查容易绕过 。接下来要害代码如下所示:


19.png


行113,对sk->sk_filter举行解引用,若是乐成获取filter指针,进入行115 。行119,挪用bpf_prog_run_save_cb()函数,参数划分为filter->prog和skb,该函数代码实现如下所示:


20.png


然后,行676,挪用__bpf_prog_run_save_cb()函数,该函数实现代码如下:


21.png


接着,行662,挪用BPF_PROG_RUN(prog,skb),该函数界说为一个宏,实现代码如下所示:


22.png


一起挪用下来,最终会挪用到红框中的代码,简化一下挪用历程为:

sk->sk_filter->prog->bpf_func(skb, sk->sk_filter->prog->insnsi) 。因此,只要控制sk->sk_filter就可以控制执行流程 。


堆喷占位


函数sk_filter()的第一个参数类型为struct sock,而现实传入的参数类型为struct amp_mgr,可以接纳堆喷128巨细的内存块举行占位,伪造amp_mgr 工具 。这里有个问题,sk->sk_filter在sock中的偏移为0x110,而amp_mgr结构体巨细为0x70,偏移已经凌驾了规模 。要解决这个问题,这里可以接纳如下巧妙的堆喷结构:


23.png


结构体amp_mgr在kmalloc-128类型的slub中被分派,从第三个块最先,amp_mgr结构体偏移0x10处,可以被伪造成sk_filter,便可以知足sk对sk_filter域的解引用,并且可控 。


结构载荷


通过堆喷占位控制代码执行流程后,接下来就是结构攻击载荷 �?梢越幽啥雅�1024巨细的内存块去伪造l2cap_chan工具,由于结构体巨细为792,正好落在kmalloc-1024 slub块中,并且a2mp通道也属于l2cap通道中,释放a2mp通道时,l2cap通道也将被释放,操控起来较为无邪,最终结构如下所示:


24.png


泄露l2cap_chan工具地点


通过堆喷结构和建设释放l2cap_chan通道等一系列操作后,可能保存一个指向kmalloc-1024内存块地点的l2cap_chan工具,可以通过CVE-2020-12352误差泄露一个内核栈上面的内核地点,如下图中红框所示:


25.png


通过该内地地点减去一个0x110偏移便可以找到一个l2cap_chan工具地点,可以通过amp_mgr结构体内存地点检查一下是否准确,由于amp_mgr结构体偏移0x18处为l2cap_chan指针,如下图中红框所示:


26.png


乐成泄露l2cap_chan工具地点后,然后去填充amp_mgr结构体偏移0x10处的数据域 。


复现测试


我们在ubuntu 5.4.0-26-generic系统下复现测试误差使用,执行历程如下:


27.png


乐成反弹root级shell,如下所示:


28.png


参考链接:

[1]https://google.github.io/security-research/pocs/linux/bleedingtooth/writeup

[2]https://github.com/google/security-research/security/advisories/GHSA-ccx2-w2r4-x649

[3]https://github.com/google/security-research/security/advisories/GHSA-7mh3-gq28-gfrq

[4]https://github.com/google/security-research/security/advisories/GHSA-h637-c88j-47wq


尊龙凯时起劲防御实验室(ADLab)


ADLab建设于1999年,是中国清静行业最早建设的攻防手艺研究实验室之一,微软MAPP妄想焦点成员,“黑雀攻击”看法首推者 。阻止现在,ADLab已通过CVE累计宣布清静误差近1100个,通过 CNVD/CNNVD累计宣布清静误差1000余个,一连坚持国际网络清静领域一流水准 。实验室研究偏向涵盖操作系统与应用系统清静研究、智能终端清静研究、物联网智能装备清静研究、Web清静研究、工控系统清静研究、云清静研究 。研究效果应用于产品焦点手艺研究、国家重点科技项目攻关、专业清静服务等 。


adlab.jpg