图1 蓝牙核心规范说明书封面
图2 蓝牙协议栈架构如图2所示,蓝牙协议栈主要分为两个部分:Host和Controller。Host主要包含链路层之上的整个蓝牙协议栈,包含传输层L2CAP以及在它之上的多种应用层协议,是蓝牙协议栈的核心部分。Controller主要与硬件驱动打交道,偏底层。本文主要关注的是Host层各协议的实现安全。从Android系统发展历史上来看,其蓝牙协议栈也一直是安全研究的重点目标。2017年Armis安全团队公布BlueBorne组合漏洞攻击链可以通过蓝牙对智能手机进行远程攻击,危害性极大。2020年Android爆出BlueFrag漏洞,攻击者可以通过该漏洞实现远程零交互的远程代码执行。OPPO安珀实验室一直致力于参与维护整个Android系统生态安全,因此也对Android蓝牙协议栈展开了深入的研究。至今我们已向Google Android安全团队提报了多个蓝牙协议栈实现安全漏洞,这次将依次介绍我们团队发现的三个不同Android蓝牙协议模块漏洞:CVE-2020-27024(SMP协议)、CVE-2021-0918(GATT协议)、CVE-2021-39805(L2CAP协议)。
图3 SMP协议工作流程
图4 Android蓝牙协议栈SMP协议的初始化代码段由BR蓝牙通信链接传入的SMP数据包将交由smp_br_data_received()函数[ 代码位于/system/bt/stack/smp/smp_l2c.cc]处理。当SMP协议栈接收到对端发起的配对请求SMP数据包SMP_OPCODE_PAIRING_REQ(0x01)时,报文处理流程则将到达以下图5的代码段。
图5 smp_br_data_received()函数代码段当smp_br_data_received()函数处理完成后,它调用smp_br_state_machine_event()函数 [代码位于/system/bt/stack/smp/smp_br_main.cc ],该函数代码实现如图6所示。
图6 smp_br_state_machine_event()函数代码段首先我们可从图7中看到全局变量smp_br_entry_table数组的SIZE其实为2。
图7 smp_br_entry_table数组定义从图6中的代码段我们可以看到由于smp_br_state_machine_event()函数在一开始执行tSMP_BR_ENTRY_TBL entry_table = smp_br_entry_table[p_cb->role]语句时并未对p_cb->role的最大值进行合法性判断,反而是取值后再判断p_cb->role的合法性。当攻击者恶意造成p_cb->role出现取值大于2的情况时,将导致smp_br_state_machine_event()函数entry_table赋值语句出现内存OOB越界读的异常。
图8 GATT协议交互图在ATT层协议框架内,拥有一组属性的设备称为服务端(Server),读写该属性值的设备称为客户端(Client),Server和Client通过ATT PDU进行交互;其中Attribute Protocol PDU报文格式如图9所示。其中Opcode:操作码(消息类型,1字节大小); Attribute Parameters:ATT参数(变长); Authentication Signature:身份验证签名。
图9 Attribute Protocol PDU报文格式ATT消息各种类型多达30多种,其中常见的消息类型包含表1中的6种类型,如下表所示。后续介绍的Android蓝牙协议栈GATT漏洞也就是存于Notification消息类型处理函数代码当中的。表1 Attribute Protocol PDU的类型表| PDU类型 | 发送方 | 描述信息 |
| 请求/Request | Client | 客户端向服务器请求数据 |
| 回复/Response | Server | 服务器对上面请求的回复 |
| 命令/Command | Client | 客户端向服务器发送命令-无回复 |
| 通知/Notification | Server | 服务器对特征数值向客户端发起通知-无回复 |
| 指示/Indication | Server | 服务器对特征数值指示发送给客户端 |
| 确认/Confirmation | Client | 客户端对指示的应答 |
图10 gatt_data_process()代码段通过分析该代码我们发现可以通过精心构造opcode值(如GATT_HANDLE_VALUE_IND:0x1D、GATT_HANDLE_VALUE_NOTIF:0x1B、GATT_HANDLE_MULTI_VALUE_NOTIF:0x23)来控制函数执行调用到gatt_client_handle_server_rsp()函数。其中GATT_HANDLE_MULTI_VALUE_NOTIF类型是后续触发漏洞的报文类型。
图11 gatt_client_handle_server_rsp()代码段最后gatt_client_handle_server_rsp()将调用到gatt_process_notification()函数。该漏洞问题代码是就位于system/bt/stack/gatt/gatt_cl.cc文件内的gatt_process_notification()函数,该函数是负责对接收到的gatt协议notification类型通知报文进行解析处理。
图12 gatt_process_notification()代码段首先介绍下Android蓝牙协议栈里常用的解析报文内容的宏定义:STREAM_TO_INT8(u8, p)从p指向的报文中读取1个字节,保存到u8类型变量当中,p指针加1;STREAM_TO_UINT16(u16, p)每次从p指向报文中读取2个字节,保存到u16类型变量当中,p指针加2。STREAM_TO_ARRAY(a, p, len)负责从p指向的报文内容读取len字节长度的数据,保存到数组变量a空间中,p指针加len长度。另外tGATT_VALUE value变量类型的结构体构造如图13所示。
图13 tGATT_VALUE结构体我们可以看到gatt_process_notification()函数内当op_code值为GATT_HANDLE_MULTI_VALUE_NOTIF类型时,value.len变量值是可以通过报文内长度字段来控制的,此时如果value.len长度大于实际数据长度len时且小于GATT_MAX_ATTR_LEN(固定值为600),后续STREAM_TO_ARRAY(value.value, p, value.len)这行代码将导致一个OOB越界读的异常内存拷贝操作。如图14所示,后续gatt_process_notification函数在循环解析报文内的多个notification消息时,由于未对解析出的value.len的长度做最大长度(不能超过GATT_MAX_ATTR_LEN)合法性校验,将导致STREAM_TO_ARRAY(value.value, p, value.len)出现内存OOB越界写的风险。
图14 gatt_process_notification()后续代码段
图15 L2CAP协议交互图L2CAP基于信道的概念,信道的每一个端点被称为信道标识符(CID),同设备间CID可复用,但本地设备CID不可复用。 L2CAP是基于分组的,但也遵循信道传输的通信模型。对端设备上两个L2CAP实体间传递的信号命令(Signaling Commands)这些信号命令通过Signaling Channel来传输,对于ACL-U逻辑链路应该使用CID 0x0001, 而对于LE-U则应该使用CID 0x0005。如L2CAP LE Signalling Channel信令通道,用于控制LE面向连接的数据信道,并可对这些LE信道的特性变化进行协商(LE-U),后续介绍的漏洞就位于L2CAP LE Signalling Channel通道信令的处理代码中。蓝牙规范定义的CID如图16所示。
图16 BLE信道CIDL2CAP数据包的格式如下图所示。
图17 L2CAP数据包的格式L2CAP信令报文格式如下所示。
图18 L2CAP信令报文格式
图19 l2cble_process_sig_cmd()代码段当L2CAP层处理基于信用的增强型流控模式的重新配置的回复(L2CAP_CMD_CREDIT_BASED_RECONFIG_RES,0x1A)报文时,其未进行包长度判断,导致内存信息泄露。顾名思义,这个回复就是响应重新配置的请求(request)报文,这个(request)请求是为了重新配置该通道的MTU和MPS的,其结构如图18。图19就是响应的回复报文。
图20基于信用的增强型流控模式的重新配置请求
图21基于信用的增强型流控模式的重新配置回复Android在2020年8月左右添加了对基于信用的增强型流控模式的支持,此漏洞代码就从那时起一直存在,如图22所示。这段代码段中,STREAM_TO_UINT16从回复报文去取result字段的值,但是取之前未判断此时回复的报文是否已经没有多余的数据了。因此,若精心构造一个该回复数据包,那么就会触发到这个地方导致OOB Read。且这个被赋值的result字段后续会返回给发送方,导致内存信息泄露。
图22 l2cble_process_sig_cmd()后续代码段目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
什么是0day漏洞?0day漏洞,是指已经被发现,但是还未被公开,同时官方还没有相关补丁的漏洞;通俗的讲,就是除了黑客,没人知道他的存在,其往往具有很大的突发性、破坏性、致命性。0day漏洞之所以称为0day,正是因为其补丁永远晚于攻击。所以攻击者利用0day漏洞攻击的成功率极高,往往可以达到目的并全身而退,而防守方却一无所知,只有在漏洞公布之后,才后知后觉,却为时已晚。“后知后觉、反应迟钝”就是当前安全防护面对0day攻击的真实写照!为了方便大家理解,中科三方为大家梳理当前安全防护模式下,一个漏洞从发现到解决的三个时间节点:T0:此时漏洞即0day漏洞,是已经被发现,还未被公开,官方还没有相
一、RIPV2协议简介 RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对
运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid
1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La
Ai-Bot基于流行的Node.js和JavaScript语言的一款新自动化框架,支持Windows和Android自动化。1、Windowsxpath元素定位算法支持支持Windows应用、.NET、WPF、Qt、Java和Electron客户端程序和ie、edgechrome浏览器2、Android支持原生APP和H5界面,元素定位速度是appium十倍,无线远程自动化操作多台安卓设备3、基于opencv图色算法,支持找图和多点找色,1080*2340全分辨率找图50MS以内4、内置免费OCR人工智能技术,无限制获取图片文字和找字功能。5、框架协议开源,除官方node.jsSDK外,用户可