我们带来的第六个重磅内容,来自美国东北大学安全研究员Dennis Giese带来的——《IoT Reverse Engineering》。
大家好,我叫Dennis Giese,我很喜欢 IoT 设备逆向分析这个技术方向,目前是美国东北大学安全研究员。大家一定很奇怪,为什么我会在这里演讲?这个缘分来自2017年的4月小米发布了一款扫地机器人,在查看他的配置时我惊奇的发现他竟然有三个处理器,而且价格非常便宜,于是我对这家公司产生了兴趣。研究后我发现小米的产品设计都很好看,最重要的就是便宜(因为我还是学生,没有太多的资金投入在设备研究上),另外就是我在这些设备上看到了一个成熟标准化的IoT生态平台。也就是从这时候开始,我深深的陷入了小米无法自拔。这两年我总共投入了 $9000 总共买了 140 件小米的智能设备,玩IoT安全绝对是一个烧钱的爱好(我曾经为了研究小米扫地机器人一口气买了15台),这张图就是米粉的证据:)
2018年小米与我取得了联系,我们在技术上非常聊得来,所以我就成为了小米安全中心外聘安全顾问,他们也开始免费给我提供大量的测试设备,不得不说我非常喜欢这一点,这是一家有趣的公司。
OK,我为什么喜欢逆向 IoT 设备?因为可以发现漏洞去控制别人的设备,或者把企业的云控制服务断开自己实现私有云操控,再或者我可以对一些功能进行增强(新的特性、本地化语言等),并且能够给其他研究者分享一些思路。
这张图是 IoT 设计架构,这里有三个重点,调试接口、固件与存储,都是容易出问题的地方。那比较常见的防护措施有哪些呢?
固件来讲就是加密与验签
硬件上会有一种叫做一次性存储芯片和eFuses熔断的产品
调试口常见的方式就是禁用
SecureBoot 和Flash整体加密比较少使用,可能开发者觉得比较麻烦或需要额外的成本
初期在做研究时我的分析设备很少,主要就是树莓派、脱焊烙铁和万用表,但有条件的话最好有回流焊和显微镜,最厉害的就是电子显微镜,能看清电路板上更多细节(但这个也最贵)。
树莓派是很给力的设备,它上面有很多开源的工具,让树莓派变成瑞士军刀,比如JTAG可以用OpenOCD链接调试,SPI Flash可以用Flashrom链接,还可以挂载flash的镜像文件等,最关键的是它自身架构就跟很多IoT设备相似。
如果我们成功的发现了设备上存在的调试接口,能做些什么呢?
如果是UART,那我可以利用它导出固件做分析,或者操作bootloader
如果是JTAG/SWD那就更强大了,我可以对寄存器、内存和MCU指令进行调试,比如分析内存结构或提取密钥
这里有个有趣的案例,这台路由器底部提供了很多散热口,而且比较大,通过这些散热孔我可以直接把金属丝钩在PCB的孔洞上,这样我不用破坏保修封条的情况下串口调试设备了。
这里大家可能会有个疑问,如果调试接口没有明确标记的情况下我们怎么找到他,接对引线呢?我有一些方法,但需要一定的经验。比如好好的阅读数据手册,它能帮你的大忙,把调试引脚明确的标记出来;擅用信号分析器,比如JTAGulator等。下面就是我对一款Zigbee网关进行的分析,找出了没有标记的JTAG接口。
找到调试口之后我们可以先获取固件,方法比较多,常用的比如直接抓OTA包,如果OTA是HTTP协议就可以直接下载了(同时还有篡改的可能性)。如果你有UART口,那可以进入系统后通过nc把核心程序发出来。如果是JTAG,可以直接尝试 memdump 读取内存中映射的Flash内容。但是!如果所有的办法都不好使怎么办?那我们就直接从存储芯片去读。这种8Pin的Flash最方便,可以用编程器的夹子夹住在线编程,如果在线编程不行就做脱焊处理离线编程。如果是BGA芯片就比较麻烦了,但也可以脱焊离线编程,但回焊操作不当的话很容易变砖。
这里还要给大家分享一个错误注入的技巧,大多数SoC都有fallback机制,在发生系统载入错误,Flash丢失等问题时会fallback到编程模式,或者允许用户修改外部启动媒体。这个机制在软件中也有可能出现。看一个BGA错误注入的例子。我们只需要一块能导电的小锡纸儿,小心点插入BGA底部,将MMC的数据针脚短接制造出错误,设备fallback到FEL模式,这时我就可以做一些事情了,比如dump flash,修改 flash ROOT设备,重刷固件等。
开发者在整个IoT中扮演了重要的角色,很多设备的安全高度与开发者能力意识成正比。比如某款产品开发时间很短,开发人员又很懒,那怎么办呢?很有可能就是搞套模块的SDK和工具链,用样例代码改改,可以跑起来了当成正式产品固件发布了,有问题就后面再说(或者永远都不管了)。
消费者也是个重要角色,如果你对安全很无知也会造成严重的安全后果,不仅仅影响你自身。比如错误的将摄像头设置在公网,没有防火墙,密码123456,那就惨了。比较实际的案例就是mirai,竟然会有这么多的感染量,绝大部分都来自于默认的登陆方式。对于蠕虫来讲小米有个坏消息给他,那就是小米的设备因为依赖云端,所以此类攻击面很少。
还有一种情况,一些硬件平台的固件无法直接用IDA分析,因为固件被压缩或没有调试符号,这种情况下我们怎么办?我在 Cortex-M 平台的固件上找到了一种方法:
首先我找到了对应的SDK
然后我编译一个超多函数,超多功能与debug符号的测试程序
对测试的程序建立一个IDA数据库,用这个数据库加载目标固件
用bindiff识别出相同的函数,这样目标固件的函数基本都可以识别了,逻辑也变的清晰起来
最后我再给大家分享一些我的个人技巧:
首先每个型号的设备多买几台,我就买了15台扫地机器人,每台设备做不同的目标分析,保证未配置和已配置的设备差异都能够得到,一个用来做初始参考,一个用来逆向和root,互不影响
做好准备工作,FCC文档和现成的拆解图找全做参考;在第一次开机前就做脱焊flash、dump固件的操作,对最原始的固件进行分析,最后在对固件打补丁
OK,我的分享就到这里,感谢在座的各位,感谢我的导师们,感谢Secure Mobile Networking (SEEMOO) Labs and CROSSING S1,感谢Andrew Sellars and Team,感谢小米,我是米粉,再见!
点击文末阅读原文,即可下载议题pdf~
前期回顾:
小米IoT安全峰会—朱玲凤《小米 IoT 隐私数据合规实践》