欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

BlueBorne 蓝牙破绽漏洞bug深度研究和PoC

来源:本站整理 作者:佚名 时间:2017-09-29 TAG: 我要投稿

前些天,armis爆出了一系列蓝牙的破绽,无打仗无感知接收体系的才能有点可骇,并且基本上影响一切的蓝牙装备,迫害不可估量,能够看这里(https://www.armis.com/blueborne/  )来懂得一下它的逆天才能:只需手机开启了蓝牙,就能够被长途节制。如今手机这么多,应用这个破绽写出蠕虫化的对象,那末能够又是一个手机版的低配wannacry了。咱们360Vulpecker Team在懂得到这些相干信息后,疾速停止了跟进阐发。 armis给出了他们的whitepaper,对蓝牙架构和这几个破绽的阐发能够说异常过细了,先膜一发。不外他们没有给出这些破绽的PoC或者是exp,只给了一个针对Android的“BlueBorne检测app",然则逆向这个发明仅仅是检测了体系的补钉日期。因而我来拾一波牙慧,把这几个破绽再阐发一下,而后把poc编写出来:
* CVE-2017-1000250 Linux bluetoothd过程信息泄漏
* CVE-2017-1000251 Linux 内核栈溢出
* CVE-2017-0785 Android com.android.bluetooth过程信息泄漏
* CVE-2017-0781 Android com.android.bluetooth过程堆溢出
* CVE-2017-0782 Android com.android.bluetooth过程堆溢出
以上PoC代码均在
https://github.com/marsyy/littl_tools/tree/master/bluetooth
因为也是因为这几个破绽才从零开端搞蓝牙,以是应当有些阐发不到位的处所,还请各路大牛示正。
0x01 蓝牙架构及代码散布
这里起首应当祭出armis的paper里的图:

图上把蓝牙的各个条理干系描写得很过细,不外咱们这里临时只需要关怀这么几层:HCI,L2CAP,BNEP,SDP。BNEP和SDP是比拟下层的办事,HCI在最底层,间接和蓝牙装备打交道。而承载在蓝牙办事和底层装备之间的桥梁,也便是L2CAP层了。每一层都有它协定规定的数据组织布局,一切层的数据包组合在一起,便是一个完备的蓝牙包(一个SDP包为例):

固然协定规定的架构是图上说的那样,然则具体实现是有分歧的,Linux用的BlueZ,而如今的Android用的BlueDroid,也就针对这两种架构说一说代码的具体散布。
BlueZ
在Linux里,用的是BlueZ架构,由bluetoothd来供给BNEP,SDP这些比拟下层的办事,而L2CAP层则是放在内核外面。对付BlueZ咱们对SDP和L2CAP挨个阐发。
1, 实现SDP办事的代码在代码目次的/src/sdp,此中sdp-client.c是它的客户端,sdp-server.c是它的办事端。咱们要阐发的破绽都是长途的破绽,以是成绩是出在办事端外面,咱们重点存眷办事端。而办事端最焦点的代码,应当是它对接遭到的数据包的处置的过程,这个过程由sdp-request.c来实现。当L2CAP层有SDP数据后,会触发sdp-server.c的io_session_event函数,来获得这个数据包,交由sdp-request.c的handle_request函数处置(怎样处置的,后续破绽阐发的时刻再讲):
static gboolean io_session_event(GIOChannel *chan, GIOCondition cond, gpointer data)
{
    ...
    len = recv(sk, &hdr, sizeof(sdp_pdu_hdr_t), MSG_PEEK); //获得SDP的头部数据,得到SDP数据巨细
    if (len int) len sizeof(sdp_pdu_hdr_t)) {
        sdp_svcdb_collect_all(sk);
        return FALSE;
    }
 
    size = sizeof(sdp_pdu_hdr_t) + ntohs(hdr.plen);
    buf = malloc(size);
    if (!buf)
        return TRUE;
 
    len = recv(sk, buf, size, 0);  //得到完备数据包
    ...
    handle_request(sk, buf, len);
 
    return TRUE;
}
2, L2CAP层的代码在内核里,这里我以Linux 4.2.8这份代码为例。l2cap层重要由 /net/bluetooth/l2capcore.c和/net/bluetooth/l2cap_sock.c来实现。l2cap_core.c实现了L2CAP协定的重要内容,l2cap_sock.c经由过程注册sock协定的方法供给了这一层针对userspace的接口。异样的咱们关怀一个L2CAP对接遭到数据包后的处置过程,L2CAP的数据是由HCI层传曩昔的,在hci_core.c的hci_rx_work函数里
static void hci_rx_work(struct work_struct *work)
{
    
    while ((skb = skb_dequeue(&hdev->rx_q))) {
        /* Send copy to monitor */
        hci_send_to_monitor(hdev, skb);
 
        ...
        switch (bt_cb(skb)->pkt_type) {
        case HCI_EVENT_PKT:
            BT_DBG("%s Event packet", hdev->name);
            hci_event_packet(hdev, skb);
            break;
 
        case HCI_ACLDATA_PKT:
            BT_DBG("%s ACL data packet", hdev->name);
            hci_acldata_packet(hdev, skb);

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载