阿里安全 谢君
一、背景
随着5G大浪潮的推进,未来万物互联将会有极大的井喷爆发的可能,而移动基带系统作为连接世界的桥梁,必将成为未来非常重要的基础设施,而基础设施的技术自主能力已经上升到非常重要的国家层面上的战略意义,从美国对待中国的通信产商华为的禁令就可以看得出基础技术的发展对一个国家的震慑,现今人类的生产生活已经离不开移动通信,未来也将会继续是引领人类科技的发展的重要媒介,人工智能,自动驾驶,物联网以及你所能想到的一切科技相关的发展都会与移动通信产生重要的联系,在此之上其安全性和可靠性将会成为人类所关心的重要问题,这也是笔者为了写这个系列文章的初衷,也希望更多的安全研究人员参与到基础设施的安全研究当中来,挖掘出更多的缺陷与隐患,完善未来的基础设施的安全。
二、概念和研究目的
3GPP 移动通信的标准化组织 3rd Generation Partnership Project,成立于上世纪末,主要职能是为了制订移动通信的技术标准,保证各个不同国家以及运营商在移动通信方面的兼容性,最常见的例子就是能够让我们的手机可以做到在不同的国家漫游使用。
3GPP所制定的移动通信技术标准涵盖了所有的2/3/4/5G通信相关的技术体系,产生了大量的技术文档供研究人员学习和参考,有兴趣的可以从3GPP的官方网站获取。
本系列文章研究对像是指3GPP定义的移动通信相关2/3/4/5G的基带软硬件和通信系统,例如手机的语音/短信/数据流量,以及物联网中使用的相关移动通信技术的端设备。基带系统本身是泛指无线通信系统里面的软/硬件和通信技术的集合体,例如蓝牙/Wi-Fi/GSM都有基带系统,所以本系列文章所指的基带系统单指移动通信相关的2/3/4/5G技术相关的基带系统。
研究对象和目的:高通的基带芯片以及对3GPP定义的对通信协议栈的实现,基带系统是一个非常庞大且复杂的系统,包括软/硬件和通信技术的完美融合,所以具有相关设计能力的芯片产商很少,从2018年基带芯片的市场份额分布,高通是这个领域市场份额做的最大的芯片产商,高通是多个国内手机产商的供应商,例如小米,oppo/vivo等,而华为现在已经有了自己基于海思芯片设计的基带系统,打破了国外基带芯片市场的垄断,现在华为的手机产品都是用的华为自产的海思基带芯片,不过软件系统还是基于人家的VxWorks,不过刚刚华为发布了鸿蒙微内核系统,这个系统很有可能华为会把基带系统移植上去,现在应该加紧进行基带系统的移植工作,本身各家的基带系统都是非常封闭的,因为涉及各家的核心技术能力,加上移动通信的复杂性,研究的人也比较少,我研究的目的之一就是挖掘里面的一些设计逻辑,结合3GPP的协议的定义来更好的理解整个基带系统的实现,并且深入挖掘里面的攻击面以及如何更好的发现里面的安全问题。
上面图片来源
研究方法:
整个系列文章将会围绕高通基带系统对3GPP定义的协议栈的实现来挖掘里面的一些业务逻辑以及挖掘相关的攻击面来进行,所以我的研究方法会针对如下层次来进行。
1. 操作系统
2. 应用系统
3. 3GPP实现的协议栈
4. 攻击面研究以及缺陷挖掘
封闭的基带系统需要大量的逆向工程的工作,来获取对基带系统行为的了解,逆向工程是安全研究者在挖掘未知的必备技能,什么时候需要逆向工程,在你无法获取目标研究对象的源代码和设计文档或者仅能够获取极少文档信息的情况下,想了解其目标对象的一些设计逻辑,原理和算法,这个时候你只能通过逆向工程这种合法手段来达到上面的目的。
逆向工程也分软件和硬件,现今的数字系统基本上都是通过软件来定义的,我们对于硬件的逆向工程就不展开讲了,有机会单独写出来,所以本文讨论的也基本上是软件层面上的逆向工程,而基带系统与硬件结合又是非常紧密的,所以对基带系统的逆向工程也需要硬件研究能力的支撑,逆向工程的难易程度也是分等级的,如下是我个人对逆向工程难易的理解,默认下面所有应用的固件都可以获取,通过研究工具的获取和研究的成本来分类。
而我们选择的研究对象高通的MDM系列芯片按我的理解难度应该在上图的L3的级别,非常有限的芯片信息的情况下。
三、高通基带硬件系统介绍
高通的基带硬件按照功能的不同分为两类:
1. MSM系列 (Mobile Station Modem)
2. MDM系列 (Mobile Data Modem)
MSM系列主要是给手持移动通信设备使用,例如手机等
MDM系列主要是给移动数据流量设备使用,车联网或其它物联网设备等
MSM系列与MDM系列的区别
MSM系列芯片包括应用处理器(Application Processor)和基带系统处理器(Baseband Processor)还有Wi-Fi,蓝牙等,这个主要是提供整体的手机解决方案来给手机产商使用,Android生态的大部分手机都是运行在高通的MSM系列的SoC之上,例如小米5手机搭载的高通骁龙系列S820的SoC就是MSM8996系列的芯片,应用处理器运行的是Android系统。
MDM系列早期只包含(Baseband Processor),主要是提供数据modem和语音的功能,苹果手机生态和车联网以及4G无线上网卡等应用中比较常见,比如iPhone 8/8 Plus和iPhone X都是配备的高通MDM9655的基带芯片,而宝马/奥迪车联网的TBOX则配备的MDM6x00系列的基带芯片,而15年生产的通用安吉星系统TBOX则采用的是MDM9215系列,为了能够提供更强大的业务逻辑能力,MDM系列基带芯片SoC剥离了基带系统和业务系统,由两个core组成,比如mdm9xxx系列芯片包含一个hexagon的DSP基带处理核,以及一个ARM Cortex-A系列的核。
从功能上来说,MSM系列的功能是包含了MDM系列的功能
所以高通的MDM系列的Baseband Processor并不是严格意义上的一块处理器,而是至少有3个core。
1. 一个基于ARM的微处理子系统
a. ARM1136 à MDM6600
b. ARM Cortex-A5 + Hexagon DSP à MDM9215
2. 一个基于高通Hexagon QDSP架构的Modem DSP(mDSP)
3. 一个基于高通Hexagon QDSP架构的Application DSP(aDSP)
这3个core的主要功能如下:
1. 这个基于ARM的微处理器属于基带系统的子系统(MDM6x00基于ARM1136的架构,MDM9x15系列基于ARM Cortex-A5以及新增了一个hexagon DSP处理器),它将协助mDSP和aDSP的初始化和与这两个core进行通信交互以及实现3GPP定义通信的所需的协议栈功能和算法,也可作为特定应用相关处理平台,例如在车联网中会将它作为TBOX的应用逻辑的处理器,MDM9x15把3GPP协议栈的实现转移到了hexagon DSP上,而MDM6x00的3GPP协议栈的实现是在这个ARM1136上完成。
2. mDSP的主要功能就是无线信号的调制与解调,在3G为代表的MDM6x00系列的mDSP主要实现CDMA/WCDMA/GSM/GNSS信号的调制与解调,在4G为代表的MDM9x15系列主要实现了包括CDMA/WCDMA/GSM/LTE/GNSS信号的调制与解调。
3. aDSP(Application DSP),主要功能是实现与应用相关的信号调制与解调,例如语音信号的调制与解调(Audio DSP),常见的应用就是我们手机语音通话时编码与解码以及压缩就是通过这个aDSP来实现。
下图为高通MDM系列基带芯片的一些特性:
上面图片来源高通
四、高通基带软件系统介绍
高通基带的软件系统从2000年左右就开始应用他们自己设计的嵌入式rtos系统REX来构建他们自己的手机基带应用系统AMSS,而且基础的应用软件架构一直沿用至今,由于基带应用系统其复杂的特性以及大量的功能应用,为了保证其应用良好的移植性和兼容性,所以基带的底层系统采用精简的微内核系统OKL4,这是一个开源的微内核系统,基于ARM的基带处理器都是采用的OKL4微内核,自从高通开发的新的hexagon DSP基带处理芯片后,一个名为QuRT嵌入式微内核系统因此而产生,这个QuRT前期也叫Blast,它的出现应该是专门为QDSPv6架构的DSP处理器而开发的,我们今天分析的MDM6600基带芯片是基于OKL4的微内核+REX AMSS应用系统,而我们重点关注的其实也是运行在REX之上的AMSS应用,下图是整个基带系统的基于ARM和基于hexagon QDSP架构逻辑,未来5G应用还会继续沿用右边的架构。
微内核的好处在于,应用系统可以保持高度的可移植性,微内核系统只要满足基本的IPC通信机制,内存管理,CPU调度机制即可,驱动文件系统等以及应用都可以在用户态来初始化完成,这对于需要支持多个硬件平台的高通来说无疑非常高效的做法,如下图是高通的系统架构。
基带软件系统主要包括如下部分:
a. 启动管理
b. 内存管理
c. 文件系统
d. 定时器机制
e. 任务管理和IPC通信机制
f. 中断管理
a. 基带系统启动过程
高通基带芯片很早就引入了secure boot的启动验证机制,来防止启动过程中运行的代码或数据被篡改,旨在安全可信计算,现在大部分高通系的手机都有这个功能,芯片上电后先被芯片的BootRom接管,该BootRom里面的代码不可篡改,里面存有flash控制器的基本读写功能,而且芯片的OTP区域可以存储产商授权的公钥证书,用于签名认证启动过程中需要认证的分区数据。以MDM6600芯片在某个车联网应用基带设备为例,它的启动过程如下:
芯片上电后执行BootRom里面代码检测是否从flash启动,如果是从flash的第一个扇区读入数据到内存并搜索secureboot启动的Magic Header,然后解析头部相应的数据结构,获取代码和数据的大小和偏移以及装载到内存的地址信息,签名/证书数据偏移和长度,如下图是DBL头部区域信息。
0x00 - CodeWord ("D1 DC 4B 84")
0x04 - Magic ("34 10 D7 73")
0x14 – Body start offset (0x2050)
0x18 - Loading address (0x20012000)
0x1C - Body size (Code + Signature + Certificate store size)
0x20 - Code size
0x24 - Signature address
0x28 - Signature length (256 bytes)
0x2C - Certificate store address
0x30 - Certificate store length
证书信息截图
当BootRom验证DBL代码和数据签名成功后,此后DBL的代码接管执行,然后搜索MIBIB分区表,获取各个分区的起始block信息,然后在相应的块去读取相应的数据,接着就是验证相应分区数据的签名,然后相应的分区代码接管,完成一系列的信任启动链,DBL验证成功后,验证FSBL,然后是OSBL,最后是AMSS。
0x00 - CodeWord ("AA 73 EE 55")
0x04 - Magic ("DB BD 5E E3")
0x0C – Partition Nums (0xa)
每个分区表信息长度0x1c,例如
0x00 – 0x10 partition name (0:FSBL)
0x10 – Partition start block information (0x0f)
0x14 – Partition block length (0x2)
这里定义的每个页是0x800字节,每个块block有64个页,所以每个block的长度是0x20000字节,所以根据这个信息我们就可以定位这些分区的物理偏移信息。
例如FSBL的物理偏移为0x20000*0xf=0x1e0000
AMSS的物理偏移为0x20000*0x16=0x2c0000
b. 基带系统内存管理
当基带系统的安全信任启动链验证完成后,最后系统被AMSS系统代码接管, AMSS系统定义了代码执行的内核特权模式以及AMSS应用模式,设置页表(映射硬件外设地址到页表中)并且开启MMU(内存管理单元),在某些敏感的内存地址区域通过MPU的特性来进行保护,只有特定权限的应用的可以访问,应用模式的代码想要进入内核态(例如IPC消息发送),可以通过设置的特权中断指令SVC进入内核态,下图就是进入特权syscall的中断向量表入口。
通过初始化页表完成内核地址空间和外设硬件地址映射,开启mmu,创建第一个rootTask后切入用户态空间,初始化用户态需要创建的应用与驱动,这里主要介绍应用层堆内存结构以及内存分配和回收算法。
REX系统堆内存分两种类型:
Big chunk(大堆)
small heap(小堆)
大堆在不同应用初始化的时候指定内存的起始地址与长度,而且根据应用功能的不同,分配方式也不同,小堆将会在大堆上进行分配使用,大堆由于给使用的应用不同,分配小堆的方式有所不同。
a. 大堆类型1,内存连续,分配小堆的方式是顺序分配,前面是分配好的小堆,后面是连续的空闲堆块,分配小堆只会在连续的空闲块上进行分配,例如前面多个分配好的小堆其中一个需要被释放后,只是把这个小堆的属性标记为freed,但由于它后面的小堆到连续的空闲块中间有标记为已经分配属性,所以后续在分配小堆的过程中不会考虑这块已经被释放的内存,除非要释放的小堆内存和连续的空闲块紧挨着,下一次分配内存时才会从这个已经标记为释放的内存上进行分配,而是直接到后面的连续空闲块上进行分配,这样做的目的是为了分配和释放内存更高效,虽然牺牲了一些空间,结构如下图。
下图是这种chunk上分配小堆的状态信息示例
b. 大堆类型2,(modem chunk),也是一个连续内存区域,但是chunk header在内存的底部,上部为分配小堆区域,分配顺序也是从上往下分配,小堆的头部数据结构中会指向上一个已经分配好的小堆,通过单向链表进行小堆内存的回溯,最上面的小堆回溯指针为空,但是它的内存分配算法跟上面的不同,就算要被释放的小堆内存和空闲块不挨着,但是它任能在下一次的堆内存申请中被重用,只要它的大小合适,而且小堆数据结构与类型1也不同,基本结构如下图。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-9-9 11:00
被kanxue编辑
,原因: