无论是公网连接还是独立网络,固件都是控制嵌入式设备的核心。因此,必须要了解如何分析固件以执行未授权的功能。要开始进行安全测试和固件逆向,在即将进行评估时,请使用以下方法作为指导。该方法包括九个阶段,旨在使安全研究人员,软件开发人员和信息安全专业人员能够进行固件安全测试研究。
以下各节将在适用的情况下通过支持示例进一步详细介绍每个阶段。
原文报告如下:
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/
可以通过以下链接下载Ubuntu虚拟机(EmbedOS),其中包含在本文档中使用的固件测试工具。有关EmbedOS工具的详细信息,可以在以下存储库https://github.com/scriptingxss/EmbedOS中的 GitHub上找到。
https://tinyurl.com/EmbedOS-2020 https://github.com/scriptingxss/EmbedOS
0x01 信息收集
在此阶段,收集有关目标的尽可能多的信息,以了解其基础技术的总体组成。奇热尝试收集以下内容:
· 支持的CPU架构
· 操作系统平台
· 引导程序配置信息(Bootloader configurations)
· 硬件原理图
· 数据表
· 代码行(LoC)估计
· 源代码存储库位置
· 第三方组件
· 开源许可证(例如GPL)
· 更新日志
· FCC ID
· 设计和数据流程图
· 威胁模型
· 以前的渗透测试漏洞报告
· 漏洞平台放出的漏洞(例如BugCrowd或HackerOne)
上面列出的信息应在安全测试工作之前收集好,确保利用内部产品线开发团队来获取准确和最新的数据。了解应用的安全控制以及项目资料,已知的安全问题以及与漏洞有关的信息。
在可能的情况下,使用开源情报(OSINT)工具和技术来获取数据。如果使用开源软件,需要下载存储库,并根据代码库执行手动和自动静态分析。有时,开源软件已经使用了提供扫描结果的供应商提供的免费静态分析工具,例如Coverity Scan和Semmle的LGTM。例如,下面的截图显示了Das U-Boot在Coverity Scan中的信息摘要。
https://scan.coverity.com/ http://www.denx.de/wiki/U-Boot/WebHome
图片:U-Boot覆盖率扫描
图片:U-Boot覆盖率扫描分析
以下是LGTM在Dropbear的分析结果截图。
https://github.com/mkj/dropbear
图片:LGTM Dropbear分析
图片:LGTM Dropbear分析结果
掌握了这些信息后,应进行威胁建模,以分析出攻击面和影响范围。
0x02 获取固件
要开始查看固件内容,必须获取固件映像文件。尝试使用以下一种或多种方法获取固件内容:
· 直接从开发团队,制造商和供应商或客户那里获取
· 使用制造商提供的说明文件从头开始编译
· 从供应商的支持站点下载
· 针对文件扩展名和文件共享平台(例如Dropbox,Box和Google驱动器)进行Google dork查询
· 通常,用户会将固件内容上传到论坛,博客或在与制造商联系以解决问题并通过zip或flash驱动器获得固件的网站上申请固件。
· 更新时做中间人(MITM)固件流量截获
· 从暴露的云提供商存储(例如Amazon Web Services(AWS)S3)下载Build版本
· 通过UART,JTAG,PICit等直接从硬件中提取
· 嗅探硬件组件内的串行通信以更新服务器请求
· 通过移动应用程序内的硬编码端点获得固件
· 将固件从引导加载程序(例如U-boot)转储到flash或通过tftp网络转储
· 从板子上拆下flash芯片(例如SPI)或MCU,以进行离线分析和数据提取(LAST RESORT)。
· 需要受支持的芯片编程器来存储flash和MCU。
列出的每种方法的难度各不相同,根据项目目标和参与规则选择适当的方法。如果可能,需要拿到固件的调试版本和发布版本,以在发布版本中编译调试代码或功能时最大程度地覆盖测试用例。
0x03 分析固件
获取固件映像后,查看文件以识别其特征。使用以下步骤分析固件文件类型,root文件系统元数据,并进一步了解其编译平台。
例如利用binutils:
file strings strings -n5 binwalk hexdump -C -n 512 > hexdump.out hexdump -C | head # might find signatures in header
如果以上方法均未提供有用的数据,则可能会发生以下情况:
· 文件可能是BareMetal(没有配置文件系统)
· 文件可能用于自定义文件系统的实时操作系统(RTOS)平台
· 二文件可能已加密
如果文件加密了,使用binwalk使用以下命令检查熵:
$ binwalk -E
低熵=不太可能被加密
高熵=可能已加密(或以某种方式压缩)。
也可以使用Binvis在线和应用程序。
· Binvis
· https://code.google.com/archive/p/binvis/
·