Nozomi Networks Labs 最近对 DJI Mavic 3 系列无人机的安全性进行了研究,特别关注了名为 QuickTransfer Mode 的基于 WiFi 的协议。该协议使用户能够在无人机不飞行时将视频和图片快速下载到他们的手机上。
成功下载并分析固件后,我们发现了一些尚未修补的漏洞。由于修补过程仍在进行中,我们无法提供有关这些漏洞的具体信息。但是,一旦补丁发布,我们计划在未来的博客中分享更多细节。
在这个博客系列的第一部分中,我们描述了 DJI 通过他们的基于云的基础设施实施的固件升级程序,分析了官方 DJI 移动应用程序,并详细说明了我们如何绕过其保护措施来下载和分析官方固件。
大疆通信组件
通常,在对设备进行安全评估时,初始阶段涉及对固件的广泛分析。这使研究人员能够获取并检查构成设备上运行的操作系统和主要服务的二进制文件和配置文件。
很遗憾,DJI 设备的固件图像无法下载,尽管一些第三方网络平台为大多数常用的 DJI 无人机和遥控器分发它们。虽然这可能是一个选择,但作为安全研究人员,我们不喜欢依赖第三方平台获取固件图像,原因有几个:
第三方平台是否值得信赖,以及它们是否分发真实数据尚不清楚;
目前尚不确定这些图像会在网上保持多久可访问
我们需要立即获得新固件版本的访问权限,以便分析新引入的功能。
出于这些原因,我们选择分析物理无人机上的 DJI 固件升级程序,以直接从 DJI 云基础设施获取固件。
为了拦截发送到无人机的固件包,我们必须了解升级过程中涉及的主要通信组件:
大疆云基础设施:基于云的网络基础设施,用于存储每个无人机型号的固件包;
遥控器:作为无人机的遥控器的设备。它由两个不同的组件组成:
无线电控制器:一种与无人机通过 DJI 专有的无线协议 OcuSync 通信的 DJI 专用硬件
移动设备:智能手机(IOS 或 Android)与无线电控制器物理连接,作为用户的图形界面
无人机设备:接收并安装固件升级包的目标设备。
大疆固件升级程序
要连接到遥控器,移动设备必须安装官方的 DJI Fly 应用程序,可以从官方 DJI 网站下载并安装。该应用程序使用户可以获取新的固件版本并通过遥控器将其推送到无人机上。每当有新的固件版本可用时,DJI Fly 会向用户发送通知,用户可以选择是否安装。固件由 DJI 签名,只有在签名验证成功时无人机才会接受。图 1 显示了官方 DJI 文档中提供的整个过程概述的图像。
图 1. 来自官方 DJI 文档的安全固件升级流程。
在对移动应用程序进行快速分析后,我们能够收集到一些额外的细节,这些细节在图 2 中总结。尽管我们尝试 passively 嗅探移动应用程序和云基础设施之间的流量,但我们很快意识到由 HTTPS 提供的加密并不足够。
图 2. DJI 安全升级程序增加了额外细节。
我们对中间人(MitM)攻击的初步尝试也因移动应用程序中实施的证书固定而失败,该证书固定仅允许与提供受信任的 TLS 证书的服务建立连接。证书固定可以通过标准库或直接在应用程序内部使用自定义代码实现。为了避免进一步的盲目尝试并克服众多障碍,我们决定对 DJI Fly 移动应用程序进行更彻底的分析,并制定有针对性的攻击方案。好消息是,检查应用程序可以提供有价值的见解,以增强我们的分析。
大疆飞行应用程序分析
我们分析了分析时可用的最新的安卓版 DJI Fly 应用程序版本:
版本 1.9.0-3055175(2022 年 12 月)
SHA256 7fbc75516445cf6c26decc08d286f76a46ab8079
在第一次静态分析概述之后,涉及检查应用程序清单和 .apk
文件中的反编译 .dex
文件,我们发现该应用程序不包含任何 DJI 实现。相反,它包含一个作为 com.secneo 实现的应用程序包装器,该包装器作为加载名为 libDexHelper.so
的本地库并在其上执行本地方法的主要入口点,如图 3 所示。
图 3. 反编译应用程序内容。
除了 libDexHelper.so 文件外,应用程序中还包含许多其他本机库。然而,由于代码被严重混淆,诸如 Ghidra 或 IDA Pro 之类的工具无法立即分析它。进一步的分析表明,打包工具还实现了几种反调试技术和特定的 Frida 检测能力,这进一步复杂化了应用程序的分析。逆向分析打包工具以了解如何绕过这些保护以便调试和检测它可能非常耗时,因为采用了强大的代码混淆。为了简化代码以便进一步分析,我们通过读取应用程序的原始内存布局从 /proc/self/maps
通过代码注入转储解密的 .dex
文件,利用 QuarksLab 的 LIEF 检查 DT_NEEDED
条目,并检查以提取解压后的数据。
因此,提取了几个 .dex
,经过使用 dex2jar 进行一些脚本编写后,创建了一个包含应用程序代码的单个 JAR 文件。现在可以使用诸如 Jd-Gui 之类的工具分析 JAR 文件,如图 4 所示。
图 4. 未打包的 DJI Fly 安卓应用程序。
击败证书固定
通过检查代码,可以找到证书固定实现,这似乎是使用 Android 生态系统提供的标准库执行的。如图 5 所示,由 javax.net.ssl
包提供的 TrustManagerFactoryJava
类用于此目的。
图 5. 证书固定实现
在这个阶段,绕过证书固定可能是一个相对简单的任务。这可以通过修改 TrustManagerFactoryclass
实现的行为方式来实现,从而忽略证书检查。为了规避打包工具的反调试和 Frida 检测能力,我们在应用程序启动之前在 zygote
级别挂钩了目标 TrustManagerFactory
。由于 Android 操作系统上的每个应用程序都会产生一个主进程的克隆来启动,这使得注入是透明的,因为它发生在应用程序引导之前。我们在一个 rooted 的 Pixel 6a 移动设备上使用了两个工具来完成这个任务:
LSPosed 框架,允许在卵细胞水平注入.
TrustMeAlready 插件,在应用程序启动期间在 zygote 级别实现 TrustManager Android 类的仪器化。
固件下载和分析
我们能够检查 DJI 移动应用程序和 DJI 云基础设施之间交换的数据,从而分析在无人机固件升级期间交换的请求和响应类型。在升级 Mavic 3 Classic 时,我们拦截了通信并分析了用于下载新固件包的 API 端点。我们的调查揭示了无人机有几个组件,每个组件都有其独特的固件图像,由模块 ID 标识并分别下载。这个过程通过对 mydjiflight.dji.com
主机上的端点 /getfile/downpath
发出经过身份验证的 HTTP REST
请求(每个固件模块一个)来完成,如图 6 所示。
图 6. 固件下载 HTTP 请求。
除了下载固件映像所需的信息,如模块 ID、产品 ID 和版本,POST 请求还包含一个用于验证请求本身的签名;我们没有探讨这个签名是如何生成的确切方式,但可以假定它是请求的一部分,基于哈希的消息认证码(HMAC)。响应包含一个带有关联认证密钥的链接,如图 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 的独立安全研究人员,他之前在 dji-firmware-tools
存储库中发布了一些与 JDI Mavic 3 相关的密钥。在他 2022 年 4 月的一条推文中,他分享了两个与 JDI Mavic 3 相关的密钥,分别被标识为更新固件图像加密密钥(UFIE)和可信启动图像加密密钥(TBIE)。这些特定密钥没有集成到 dji-firmware-tools
脚本中找到的密钥列表中,以便解密和解压固件,因此我们手动将它们添加到代码中,分别作为 UFIE-2022-04
和 TBIE-2022-04
。通过这一补充,我们最终成功使用手动添加的密钥 UFIE-2022-04
解密了固件,如图 9 所示。
图 9。Mavic 3 经典固件解密。
一旦解压缩,发现这个块是一个 JAR 存档,如图 10 所示。经检查,发现它具有与官方文档中描述的 Android OTA 软件包相同的结构。这使我们相信 Mavic 3 无人机系列运行基于 Android 的操作系统。
图 10。Mavic 3 经典的 Android 图像。
解压缩存档的内容后,我们将注意力集中在构成主要 Android 操作系统的文件上 - 即内核、二进制文件和配置文件。这是因为我们的主要目标是对无人机上运行的服务进行逆向工程,可能识别出任何潜在的漏洞。
我们已经能够使用 Google 提供的 Brotli 官方实用工具和工具 sdat2img 来解压缩分别是系统(/system 文件夹)和供应商(/vendor 文件夹)分区的 vendor.new.dat.br
和 system.new.dat.br
文件,以创建可挂载的 ext4
镜像,如图 11 所示。系统和供应商分区包含运行无人机服务所需的所有二进制文件、库文件和配置文件。
图 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 模式有关。
声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与技术交流之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。
如果你是一个车联网攻防的长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款。
5-20人 88元
20-50人 98元
50-100人 128元