前言
上周六在看雪安全峰会分享了一个议题,整理了一下分享过程中的一些内容,做了一个简单记录,有些地方由于时长有限,可能过的比较快,感兴趣的朋友可以看一下文字的一些记录,议题的PPT和视频demo上传至百度云了,论坛里有需要的朋友可以下载下来,欢迎一起学习和交流。
同时也是首次公开一种本人在对智能设备进行安全测试过程中摸索和总结出来的一种uboot提取固件的方法。
链接:https://pan.baidu.com/s/1d3zuTKPKb-hg4kM_Qxf9Hw
密码:pf1b
下面是根据我当时演讲的发言,从速记员的记录整理的。
非常感谢看雪邀请我在这里做演讲!题目是“智能设备漏洞挖掘中的几个突破点”。
我来自绿盟科技工业物联网安全实验室,专长是硬件的固件安全。插播一条招聘广告,如果对工业物联网安全研究有兴趣的朋友,欢迎联系我们。
今天我讲的目录大纲是这四点。
一、智能设备基础知识
二、
提取固件的十种思路
三、
从固件发掘漏洞的思路
四、
智能设备的加固建议
我既做过智能设备的开发者,也做过安全从业人员,在会议上把硬件和固件知识介绍给搞安全的朋友,把安全的知识介绍给搞开发的朋友。希望大家能喜欢。
一、智能设备基础知识
这是智能设备的组成,分为几个部分,智能设备必须有这么几个东西,比如它必须有CPU、内存、相当于硬盘的flash,有网络、网口接口、串口,有时会有SD卡插座存储设备,也有的有显示界面。
CPU有很多架构,有X86、MIPS、ARM等;内存分为好几种。存储也有各种,比如flash、TF卡、mmc卡、硬盘;一般的电路板都会留串口,尤其做调试时。厂商做维护时不得不面对的问题:智能设备如果在使用中出现了问题,客户要求马上给解决,如果开发者没有维护的接口,开发人员到现场可能解决不了问题。所以这些是必备的;有时是串口,有时是网口之类的;有时候是USB口。智能设备内运行的软件也叫固件,固件有对系统进行引导的部分,常用的是Uboot,这占很大市场份额;操作系统用Linux非常多,因为它对网络的支持非常好。
跟大家介绍一下什么是串口,串口一般分为两种类型,主要是RS232或者TTL,TTL是5V或者3.3V,相当于CPU的电压。左下角是对串口的定义,串口真正引用的是三条线,就是RXD、TXD、DCD。串口传输时,有三根线的时候,是按照一定的时序传输的,这个时序有一定的周期,这个周期是异步产生的。异步传输有一个波特率的概念: 如:9600的波特率,换算过来大概1秒钟传送1000个字节。波特率越大,传输越快。
智能设备的组成里比较重要的还有flash,分为两种,一种是Nor falsh,它的特点是价格比较贵、容量小、地址线和数据线是分开的,好处是CPU可直接寻址,因为电路图上每一个地址线都是单个连出来的,数据线也是单独连出来的。它常用做代码存储,存储容量越大,这个地址线是越多的。
算一下上图的nor Flash的地址线的寻址范围:
8MB = 0x800000(16进制)
换算成二进制: 100000000000000000000000
地址线正好是从addr0 - addr22. 最大地址是22个1
还有一种是Nand Flash,它价格便宜、容量大,主要用作数据存储,但这个东西一般是不可寻址,需要驱动程序。
下面讲一下软件里面的Uboot和busybox,Uboot在嵌入式里一个功能是做引导程序,启动的时候引导用,还有一个功能是做更新时用.支持CPU的种类比较多,比如ARM、Linux、MIPS、PowerPC都支持,也支持简单的网络命令之类的。Busybox集成了三百多个常用的Linux命令和工具软件,它非常小巧,编译后大概在1-2兆左右,但支持的命令非常多,而且可以根据需要做裁减。例如:有的裁剪了busybox的指令nc,dd,tar等。
这是智能设备软件和硬件的协作关系,以Linux操作系统为例,上面是内存,下面是存储flash,中间是固件,固件里面的Uboot是启动时引导用的,启动起来是kernel,后面跟着是文件系统,文件系统里面包括RAMFS和FALSH FS。
这是升级接口,我们对维护接口要有一定的了解,为什么?因为接口是非常重要的,一个是升级时要用,另外一个是调试时要用,还有一个是升级固件时要用。调试接口的基本就是这几个功能。
二、提取固件的十种思路
这十种思路是我所熟知的,是我经常用的十种方法,其他不讲的方法并不代表不存在。固件提取方法简单分为硬件和软件两种类型。
我刚才对基础知识做了大概的介绍,比如我要提取它的固件,它的固件放在flash里,我肯定要做一些了解。还有对串口和接口都要有研究。还有固件里面支持这些程序,对文件系统、基础小命令等都要有一定的了解,这些知识和技巧利用好是可以发挥很大功效的。
智能设备提取固件的十种思路:
这里先讲九种固件提取方法, 最后一种方法给大家一个惊喜!
1、 官网或联系售后索取升级包。这点不多讲。
2、 在线升级方式提取固件。如果有手机应用或者电脑应用,可以点“升级”,升级固件的时候就可以通过抓包的方式,把固件给抓到。如果老版本和新版本固件的下载地址有一定的命名规律的话,新版本抓到了,老版本也可以猜出来。PPT这只是一个例子,并不针对于任何厂家。
3、 逆向升级软件,软件内置解包和通讯算法。如果它的设计是在下位机解密的话稍微安全点;在上位机解密的话是可以逆向破解的。
4、 从调试接口:JTAG/SWD等方式获取固件。
腾讯玄武实验室的小马哥去年有两次公开讲解,今天时间所限,不做描述。
5、折flash、SD/TF卡、硬盘等,用编程器/读卡器获取固件。
常用的是焊下flash芯片,用编程器读取固件,读完后再把芯片焊回去。
需要注意的是芯片是有方向的,第一脚的地方有一个圆点,焊接或用编程器读取时,弄清芯片的方向。
6、从串口(UART)调试口获取固件。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-11-20 15:39
被ylml编辑
,原因: 修改pkiot 网友指正的问题。感谢 pkiot 指出文中的错误。