Nozomi Networks Labs 最近对 DJI Mavic 3 系列无人机的安全性进行了研究,特别关注名为 QuickTransfer 模式的基于 WiFi 的协议。该协议使用户能够在无人机不飞行时将无人机上的视频和图片直接快速下载到手机上。
成功下载并分析固件后,我们发现了几个尚未修补的漏洞。由于修补过程仍在进行中,我们无法提供这些漏洞的具体信息。不过,我们计划在补丁发布后在未来的博客中分享更多详细信息。
在本博客系列的第一部分中,我们描述了 DJI 通过基于云的基础设施实现的固件升级过程,分析了官方 DJI 移动应用程序,并详细介绍了我们如何绕过其保护来下载和分析官方固件。
大疆通讯组件
通常,在对设备进行安全评估时,初始阶段涉及对固件的广泛分析。这使得研究人员能够获取并检查构成设备上运行的操作系统和主要服务的二进制文件和配置文件。
不幸的是,尽管一些第三方网络平台为最常用的 DJI 无人机和 RC(遥控器)分发了 DJI 设备的固件映像,但 DJI 设备的固件映像无法下载。虽然这可能是一种选择,但作为安全研究人员,我们不喜欢依赖第三方平台来获取固件映像,原因如下:
-
目前还不清楚第三方平台是否值得信赖,以及它们是否分发真实的数据;
-
目前还不确定这些图像可以在线访问多久;
-
我们需要立即访问新的固件版本,以便能够分析新引入的功能。
出于这些原因,我们选择在实体无人机上分析 DJI 固件升级过程,以直接从 DJI 云基础设施获取固件。
为了拦截发送到无人机的固件包,我们必须了解升级过程中涉及的主要通信组件:
-
DJI 云基础设施:基于云的网络基础设施,存储每个无人机型号的固件包。
-
遥控器:充当无人机遥控器的设备。它由两个不同的组件组成。
-
无线电控制器:DJI 专用硬件,通过称为 OcuSync 的 DJI 专有无线协议与无人机进行通信。
-
移动设备:与无线电控制器物理连接的智能手机(IOS 或 Android),充当用户的图形界面。
-
无人机设备:接收并安装固件升级包的目标设备。
DJI 固件升级流程
要连接遥控器,移动设备必须安装DJI Fly 官方应用程序,该应用程序可以从 DJI 官方网站下载并安装。该应用程序使用户能够获取新的固件版本并通过无线电控制器将其推送到无人机。每当有新固件版本发布时,DJI Fly 都会向用户发送通知,用户可以选择是否安装。固件经过 DJI 签名,只有签名验证成功后才会被无人机接受。图 1 显示了 DJI 官方文档中的图像,概述了整个过程。
图 1. DJI 官方文档中的安全固件升级过程。
对移动应用程序进行快速分析后,我们能够收集一些其他详细信息,如图 2 所示。尽管我们尝试被动嗅探移动应用程序和云基础设施之间的流量,但我们很快意识到这还不够,因为HTTPS 提供的加密。
图 2. DJI 安全升级过程,包含更多详细信息。
我们最初尝试的中间人 (MitM) 攻击也失败了,因为移动应用程序中实施了证书锁定,该应用程序只允许与提供可信 TLS 证书的服务进行连接。证书固定可以通过多种方式实现,使用标准库或直接在应用程序内部使用自定义代码实现。为了避免进一步的盲目尝试并克服重重障碍,我们决定对 DJI Fly 移动应用程序进行更彻底的分析,并制定有针对性的攻击场景。好消息是,检查应用程序可以提供宝贵的见解来增强我们的分析。
DJI Fly应用分析
我们分析了分析时适用于 Android 的最新 DJI Fly 应用程序版本:
-
版本 1.9.0-3055175(2022 年 12 月)
-
SHA256 7fbc75516445cf6c26decc08d286f76a46ab8079
在第一次静态分析概述(涉及检查应用程序清单和文件.dex中的反编译文件)之后.apk,我们发现该应用程序不包含任何 DJI 实现。相反,它包含一个实现为 com.secneo 的应用程序包装器,该包装器充当加载称为 的本机库并在其上执行本机方法的主要入口点libDexHelper.so,如图 3 所示。
图 3.反编译的应用程序内容。
除了libDexHelper.so文件之外,应用程序中还包含许多其他本机库。然而,由于代码被严重混淆,Ghidra 或 IDA Pro 等工具无法立即对其进行分析。进一步分析发现,该加壳器还实现了多种反调试技术和特定的Frida检测功能,这使得应用程序分析更加复杂。由于使用了强大的代码混淆,逆向和分析加壳器以了解如何绕过这些保护以对其进行调试和检测可能非常耗时。为了简化代码以便进一步分析,我们通过代码注入.dex读取应用程序的原始内存布局,利用QuarksLab 的 LIEF 条目来转储解密的文件,并检查它以提取解压的数据。/proc/self/mapsDT_NEEDED
结果,.dex提取了几个,并在使用 dex2jar 编写一些脚本后,使用应用程序代码创建了一个 JAR 文件。现在可以使用 Jd-Gui 等工具分析 JAR 文件,如图 4 所示。
图 4.解压后的 DJI Fly Android 应用程序。
击败证书固定
通过检查代码,可以找到证书固定的实现,它似乎是使用Android生态系统提供的标准库执行的。TrustManagerFactory Java 该包提供的类(javax.net.ssl如图 5 所示)用于此目的。
图 5.证书固定实施
在此阶段,绕过证书锁定可能是相对简单的任务。这可以通过TrustManagerFactoryclass以忽略证书检查的方式修改实现的行为来实现。为了规避加壳器的反调试和 Frida 检测功能,我们将目标挂接TrustManagerFactory到zygote应用程序启动之前的级别。由于 Android 操作系统上的每个应用程序都会生成要启动的主进程的克隆,因此这使注入保持透明,因为它发生在应用程序引导之前。我们在已 root 的 Pixel 6a 移动设备上使用两个工具完成了此操作:
-
LSPosed Framework,允许在 zygote 级别进行注入。
-
TrustMeAlready插件,它在应用程序启动期间在 zygote 级别实现 TrustManager Android 类检测。
固件下载与分析
我们能够检查 DJI 移动应用程序和 DJI 云基础设施之间交换的数据,这使我们能够分析无人机固件升级期间交换的请求和响应的类型。在升级 Mavic 3 Classic 时,我们拦截了通信并分析了用于下载新固件包的 API 端点。我们的调查显示,该无人机有多个组件,每个组件都有其独特的固件映像,由模块 ID 识别并单独下载。此过程是通过向主机上的HTTP REST端点发出经过身份验证的请求(每个固件模块一个)来完成的,如图 6 所示。/getfile/downpathmydjiflight.dji.com
图 6.固件下载 HTTP 请求。
除了下载固件映像所需的信息(例如模块 ID、产品 ID 和版本)之外,POST 请求还包含用于验证请求本身的签名;我们没有探究生成此签名的确切方式,但推测它是作为请求一部分的基于哈希的消息身份验证代码 (HMAC)。响应包含一个带有关联身份验证密钥的链接,auth_key如图 6 所示,这是下载固件映像所需的。只需使用提供的链接和身份验证密钥作为参数执行wget tool即可足以下载固件,如图 7 所示。
图 7.使用 wget 下载固件。
下载的固件映像遵循以下格式productID_moduleID_moduleVersion_buildDate.pro.fw.sig.对于 Mavic 3 Classic,可用列表中最有趣的升级包是关联 ID 0802 的模块,因为其尺寸较大,这表明它可能包含无人机的主操作系统。要分析固件映像的结构,社区维护的 Github 存储库 dji-firmware-tools 是一个很好的信息来源,其中包含文档和一些脚本。通过检查 的代码dji_imah_fwsig.py,可以了解固件映像是如何组成的:
-
图像标头包含加密的基于块的有效负载的大小(块的数量)以及加密和解密数据的校验和。
-
指定图像内数据块的偏移量和大小的块标头列表。
-
图像和块标头的基于 RSA 的数字签名。
-
包含升级固件所需数据的 AES 加密块列表
图 8.DJI固件映像布局。
固件映像的真实性由数字签名的映像标头强制执行。旨在更改任何类型数据的攻击者应更新图像标头内的校验和和摘要值(图 8),从而需要生成新的有效 RSA 签名(如果没有所需的私钥,显然这是不可行的)。这确保了无人机只会安装 DJI 提供的固件。从 DJI 官方文档可以了解到,无人机上的密钥管理是通过 ARM TrustZone CryptoCell 执行的,该芯片存储密钥以执行加密和签名验证操作。
中提供的脚本dji-firmware-tools (dji_imah_fwsig.py)包含可用于解密固件的泄露密钥列表,但是这些密钥对于我们正在使用的下载映像都无效。幸运的是,我们在 Twitter 上找到了一位名叫 Felix Domke 的独立安全研究员,他之前在存储库中发布了一些与 JDI Mavic 3 相关的密钥dji-firmware-tools。在 2022 年 4 月的一篇推文中,他分享了与 JDI Mavic 3 相关的两个密钥,分别为更新固件映像加密密钥 (UFIE) 和可信启动映像加密密钥 (TBIE)。这些特定密钥没有集成到dji-firmware-tools脚本中找到的用于解密和解包固件的密钥列表中,因此我们分别手动将它们添加到代码中,作为UFIE-2022-04和TBIE-2022-04。通过此添加,我们终于能够使用手动添加的密钥成功解密固件UFIE-2022-04,如图 9 所示。
图 9.Mavic 3 Classic 固件解密。
解压后,发现该块是一个 JAR 存档,如图 10 所示。经检查,发现它与官方文档中描述的 Android OTA 包的结构相同。这让我们相信Mavic 3系列无人机运行的是基于Android的操作系统。
图 10.Mavic 3 classic 的 Android 镜像。
解压存档内容后,我们将注意力集中在构成主要 Android 操作系统的文件上,即内核、二进制文件和配置文件。这是因为我们的主要目标是进行逆向工程并可能识别无人机上运行的服务的任何漏洞。
我们已经能够使用 Google 提供的 Brotli 官方实用程序和工具 sdat2img 分别解压系统(/system 文件夹)和供应商(/vendor 文件夹)分区的文件来创建可安装vendor.new.dat.br映像,如图 11 所示。供应商分区包含运行无人机服务所需的所有二进制文件、库和配置文件。system.new.dat.brext4
图 11.供应商和系统分区列表。
除了系统和供应商分区之外,该文件normal.img是另一个有趣的目标,因为它包含主要的 Linux 映像(内核和根文件系统)。该文件已加密,只能使用脚本TBIE-2022-04中手动添加的密钥进行解密dji_imah_fwsig.py。使用此密钥对其进行解密会产生 18 块解密数据。
解密的块主要包含 Linux 内核映像及其运行所需的文件,以及包含可使用 cpio 解压缩的根文件系统分区的附加存档。将先前提取的供应商和系统文件夹复制到根分区内即可完成文件系统 Android 布局,如图 12 所示,其中包含分析和逆向工程无人机上运行的服务所需的一切。
图 12.完整的文件系统布局。
现在我们已经有了无人机的完整文件系统,我们可以检查操作系统配置以了解内部结构并绘制攻击面。
通过对 init 脚本(包括 init.rc 和所有导入的配置脚本)的彻底分析,可以找出无人机上运行的主要服务以及哪些二进制文件实现它们。这使我们能够对它们进行静态逆向工程,如果可能的话,通过仿真动态分析它们。
通过彻底分析 init scripts(包括init.rc所有导入的配置脚本),可以找出无人机上运行的主要服务以及哪些二进制文件实现它们。这使我们能够对它们进行静态逆向工程,如果可能的话,通过仿真动态分析它们。
大疆创新以超过 90% 的份额主导无人机市场,满足专业和业余用户的需求。鉴于其重要的市场影响力,大疆设备中的任何安全漏洞都可能产生重大影响,不应低估。
在本博客系列的第 2 部分中,我们将研究通过进一步分析发现的几个与 Mavic 3 系列上实现的 QuickTransfer 模式相关的漏洞。
原文地址:
by - Nozomi Networks Labs :
https://www.nozominetworks.com/blog/dji-mavic-3-drone-research-part-1-firmware-analysis
原文始发于微信公众号(Ots安全):DJI Mavic 3 无人机研究第 1 部分:固件分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论