消费级无人机可以用于高级航拍、物流和人道主义救援等等。但是其广泛使用给安全、安保和隐私带来了许多风险。例如,攻击方可能会使用无人机进行监视、运输非法物品,或通过侵入机场上方的封闭空域造成经济损失。为了防止恶意使用,无人机制造商采用多种对策来强制安全可靠地使用无人机,例如对速度和高度施加软件限制,或使用地理围栏实施禁飞区。
作为对传统对策的补充,市场领导者大疆(DJI)为无人机实施了一种称为 DroneID 的跟踪协议,该协议旨在将无人机及其操作员的位置传输给授权实体,例如执法部门或关键基础设施的运营商。
本文中分析了无人机的安全和隐私声明,重点关注市场份额为 94% 的领先制造商 DJI。首先,将现有无人机的攻击面系统化,并调查了能够窃听无人机空中数据流量的攻击。通过对DJI固件的逆向工程实现了大疆专有跟踪协议 DroneID 的解码器,且仅使用廉价的COTS硬件。研究结果表明,DroneID传输的数据未加密且任何人都可以访问,这损害了无人机操作员的隐私。
其次,对无人机安全性进行了全面分析:结合逆向工程、针对 DJI 通信协议定制的新模糊测试方法以及硬件分析,研究者发现了无人机固件中的几个关键缺陷,这些缺陷允许攻击者在两个不同的平台上获得DJI 无人机及其遥控器的更高特权。这种根访问权限可能会导致禁用、绕过反制或滥用。此研究总共发现了 16 个漏洞,从拒绝服务到任意代码执行等等。这些错误中的 14 个可以通过操作员的智能手机远程触发,并导致无人机在飞行途中坠落。
尽管存在潜在的安全隐私风险以及无人机的滥用,但有无人机系统的系统安全方面尚未得到全面评估。本研究包括:
• 安全分析:对市场领导者大疆的消费级无人机进行了全面的安全分析。这个分析包括无人机本身和遥控器的硬件、软件和无线物理层。通过分析揭示了多个严重的安全漏洞,这些漏洞允许任意命令执行和绕过反制措施,甚至可以在飞行途中远程破坏无人机。
• DroneID: 对当前大疆无人机的固件和无线物理层进行逆向工程,以分析 DJI 的专有传输协议 OcuSync。基于这些发现,得到了DroneID 接收器、解调器和解码器的组合,以揭示包括无人机和远程操作员实时位置在内的敏感信息。
• 模糊测试:设计并实现了一个定制的黑盒fuzzer,它将 DJI 特定语法与新的Bug Oracle相结合,以识别无人机及其遥控器中的故障。该fuzzer发现了可用于获得根访问权限,目前大疆已修复所有错误。模糊测试框架和相关数据已开源:https://github.com/RUB-SysSec/DroneSecurity
大疆是全球领先的商用无人机制造商,总市场份额约为 54%(截至 2021 年底),在消费无人机领域的市场份额为 94%。DJI 提供了一份关于其安全机制的白皮书(https://security.dji.com/data/resources/ ),从而在安全和安全方面建立了坚实的基线。鉴于大疆的实际重要性,本研究的工作重点关注该供应商在 200 克到 1 千克之间的消费级无人机。在这项工作中使用三种不同的大疆无人机模型及其相应的遥控器 (RC) 进行安全分析以及针对不同固件的逆向工程:
• DJI Mini 2,RC:RC231
• Mavic Air 2,RC:RC231
• Mavic 2 Pro / Zoom, RC: RC1B
下文概述了大疆无人机的接口和通信协议,这些都直接暴露给攻击者。
上图概述了大疆无人机的不同接口,以及如何使用这些接口在无人机、遥控器 (Remote Control,RC) 和计算机之间进行通信。在无人机运行过程中,无人机与遥控器进行通信,而计算机仅用于分析、更新或访问无人机或遥控器上的文件。
无人机和遥控通常都有一个 USB 接口,用于各种设备类别和用例。预期用例是下载数据,例如来自内部存储的媒体文件或来自飞行记录器的飞行日志。对于 DJI 设备,USB 接口还用于发送大疆通用标记语言 (DJI Universal Markup Language,DUML) 命令 - DJI专有通信协议 - 以控制设备的内部设置或启动固件更新。此外,在设备的启动过程中会暴露一个引导加载程序,它可以通过特定的 USB 数据包触发。遥控器(RC231)上有两个 USB 接口,一个用于连接智能手机和遥控器以访问 DJI Fly 应用程序,另一个用于为遥控器充电。充电端口还可用于将遥控器连接到计算机。
通用异步收发器 (UART) 接口主要用于有线通信的微控制器。这种 UART 接口也可以在大疆无人机中找到,如Sparrow S1 收发器,也称为 S1 片上系统(System on a Chip,SoC)。在硬件分析过程中发现该界面在启动后启用了两秒,并显示了bootloader的启动画面。
包括蓝牙、WiFi 和 OcuSync。最新的大疆无人机支持不同的无线协议,如蓝牙和 WiFi。 例如,使用 DJI Fly 应用程序将无人机相机拍摄的照片传输到智能手机。 WiFi 连接也可用于 Mavic Pro 或 Mavic Air 等较旧的无人机,但用于命令与控制 (C2) 链接以通过智能手机控制无人机。在较新的大疆无人机上,此通信链路已被专有的 OcuSync 无线电协议所取代,该协议的性能明显更好并且不易受到干扰。
DUML是大疆使用的专有通信协议,可用于在内部模块之间以及从 RC 向无人机发送命令和数据。 DUML 用于设置和更改无人机的参数,如最大高度的飞行参数或最大上升和下降速度等不同速度参数。由于此协议的解析过程容易出错,因此 DUML 是进一步安全分析的有趣目标。因此,在下面提供了此自定义协议的详细概述。
区分两个 DUML 协议版本:V1 和 Logic。Logic协议用于无人机各个模块之间的内部通信,而V1协议用于通过USB在计算机和无人机之间进行通信。
如上图所示,DUML数据包的结构可分为四个部分:标头、传输、命令和有效负载。标头包含一个设置为固定值 0x55 的魔术字节,然后是数据包的长度、版本号和 CRC-8 标头校验和。标头后面是传输数据,用于设置 DUML 命令的发送者/接收者。有 32 种已知的发送方和接收方类型(如PC, Mobile App, Center Board和WiFi)。除了源和目的地之外,数据包的传输部分还包含一个唯一的序列号,用于维护多个数据包的顺序。
DUML 数据包的第三部分是它自己的命令。此处定义了字段 commandtype、commandset 和 commandid。将根据commandtype设置确认类型、数据包类型和加密类型。 commandset 指定哪一组命令可以用于 commandid。有 17 个已知的命令集可以使用,如general, flight controller, WiFi或battery。逆向工程结果证实了这些发现。数据包的最后一部分是有效负载和对整个数据包计算的 CRC-16 校验和。出于效率原因,在信息紧凑的地方使用自定义编码。上图和下图分别总结了这种编码和解码。接下来将基于恢复的 DUML 格式进行动态安全测试,并使用它来构建自定义模糊测试框架。
大疆为 iOS 和 Android 提供了一个应用程序来显示实时视频源和其他控件。最新的无人机使用 DJI Fly 应用程序,而传统无人机使用 DJI Go 4 应用程序。这两个应用程序提供基本相同的功能,特别是都显示无人机的实时视频源、允许拍照和录制视频、更改不同的无人机设置、更新固件或检查无人机的一般状态。
根据复杂性,无人机使用不同的操作系统 (OS)。对于大多数 DJI 无人机,操作系统基于 Android,Android 也用于旧版本的遥控器(例如 Mavic Pro RC GL200)。 DJI Mini 系列使用基于 Buildroot的 32 位 ARM Linux。 对于时间和性能关键的操作,使用实时操作系统 (RTOS),例如。例如,飞行控制器和较新的 RC(例如 RC231)在收发器中使用两个 RTOS 来管理射频 (RF) 连接 - 一个应用程序和一个通信处理器。收发器中 RTOS 的固件可作为两个处理器的加密二进制文件使用。操作系统(RTOS 固件除外)采用基于嵌入式系统中常用的 BusyBox 软件套件。 DJI 以使用 AES 加密并使用 RSA 签名的专有文件格式对其固件进行编码。不同的模块、文件和用例(例如固件更新或传输)使用不同的加密密钥。其中一些加密密钥已被 DJI 社区的个人泄露,用于解密部分固件; 研究者确认这些密钥有效。
接下来,概述了无人机中使用的典型硬件组件。下图以 DJI Mini 2 为例显示了此类无人机基本组件的概览。该图还说明了各个组件如何链接在一起以及它们如何相互通信。此概述和以下描述可转移到仅组件性能不同或具有额外传感器的其他 DJI 无人机型号。
飞行控制器是无人机最关键的部分,必须在任何情况下都有可靠性、可预测性和确定性。为了确保这些属性,飞行控制器使用了 RTOS。 控制器通过收集来自惯性测量单元 (IMU)、指南针、GPS 或视觉定位系统等传感器的输入来监督飞行行为。它使用此信息通过向调节四个电机速度的电子速度控制 (ESC) 控制器发送指令来维持稳定飞行。此外,它还负责通过检查电调、电池和其他模块的状态来批准飞行并允许无人机起飞。此外,它还会检查内部禁飞区 (NFZ) 数据库,以确定无人机是否被禁止进入附近空域的特定区域。飞行控制器通过收发器(此处为 S1 SoC)接收控制命令,并对从该 SoC 接收到的用户输入做出反应。此外,飞行控制器将来自不同模块和传感器的信息发送到收发器。
该 SoC 处理图像传感器和视频编码。它接收来自摄像机的视频和图像数据,对其进行处理,并将其转发给收发器。如果安装了额外的传感器来避免碰撞,它们的数据也会在此 SoC 中处理。除了将视频数据发送到收发器外,SoC 还使用 USB 接口将图片或视频存储在内部存储器或 SD 卡上。最后,它处理无人机的固件更新过程。此 SoC 为 DJI 无人机使用基于 Linux 或 Android 的操作系统。
遥控器通过 C2 链路控制无人机和相机。来自控制器和智能手机的用户输入被发送到收发器,收发器调制信号并通过 OcuSync 协议传输。此外,RC 接收无人机的下行链路数据,其中包括遥测数据和视频馈送,然后将其传递给智能手机。 RC231 也使用 S1 SoC 作为收发器,支持最新的 DJI 无人机,如 DJI Mini 2、Mavic Air 2、Mavic Air 2s 和 Mavic 3。这些无人机使用 OcuSync 传输协议进行 C2 和下行链路。选择的OcuSync版本以实际无人机机型为准 - 可以是 OcuSync 2.0、3.0 或 3+。
收发器结合了用于无线电通信的发射器和接收器,是无人机的重要组成部分。它通过专有协议或无线标准(如蓝牙或 WiFi)工作。一些最新的 DJI 无人机使用所谓的 Sparrow S1 收发器进行 OcuSync 传输。该收发器是基于 ARM Cortex-M CPU 的专有 SoC,可以在 Mini 2 和 Mavic Air 2 中找到。Mavic Air 2s 和 Mavic 3 使用所谓的 P1(Pigeon)SoC 作为收发器。本研究专注于 S1 SoC。
该 SoC 用作 OcuSync 的收发器,并包含两个用于应用处理器和通信处理器的 RTOS。 RTOS 的固件称为 Sparrow 固件,可以在 RC 的固件更新以及无人机的文件系统中找到。无人机中的收发器接收来自飞行控制器的遥测数据和其他报告以及来自视频编码 SoC 的视频数据。然后,所有这些数据都经过 RF 调制并通过天线传输。此外,收发器从遥控器接收 C2 链路并将此数据传递给飞行控制器。
WiFi 或蓝牙芯片也可以作为收发器,连接遥控或智能手机来控制无人机。然而,这种设置的缺点是范围和可靠性不如专有无线电协议。 DJI Mini 2 和 Mavic 3 有一个额外的 WiFi 和蓝牙芯片,允许用户轻松访问存储在无人机上的媒体文件。
大多数当前的消费级无人机都有一个连接到万向架的高分辨率相机。该万向架补偿了无人机的运动,并确保稳定的图像。除了主摄像头,无人机还可以使用额外的摄像头来避免碰撞。其他传感器可以包括用于测量无人机高度的红外线或超声波传感器,或分别用于测量加速度和倾斜度的加速度计和陀螺仪传感器。
当前一代的大疆无人机使用专有的 OcuSync 协议,在不受管制的 2.4 GHz 和 5 GHz ISM 频段中进行无线传输。无人机将高带宽、实时视频传输到 RC,然后传输到连接的智能手机。 RC 通过 C2 信号控制无人机。根据 DJI,上行链路和下行链路均采用 AES-256 加密。 OcuSync 在 2.4 GHz 和 5 GHz ISM 频段的传输范围约为 15 公里。
根据 FCC ID 数据库,这些设备使用 20 MHz 宽的信道作为下行链路(从无人机到远程)和正交频分复用 (OFDM) 信号。控制上行链路使用较窄信号的跳频。早期的无人机使用可以使用 WiFi 卡嗅探的“增强型 WiFi”。相比之下,没有公开可用的 OcuSync 兼容接收器可以解码来自无人机或 RC 的信号。
无人机是由许多模块组成的复杂网络物理系统。如前图所示,这些模块为攻击者暴露了各种接口。组件和接口的相互作用需要访问功能的系统化,以提供对无人机的全面安全分析。这些接口可分为无线接口和需要物理访问的接口。
在安全分析的第一部分,假设攻击者无法物理访问无人机本身或 RC 的场景。因此,攻击者仅限于无线链路和广播信号。设想一个攻击者被动地监听无线物理层以检测无人机以及伴随的 RC(即操作员)的下落。在后文中放宽了这一假设,并考虑攻击者可以物理访问无人机,因此具有更广泛的利用功能和访问关键信息的能力。
无线链路是一个关键的攻击媒介,因为它控制着无人机并且可以远程访问。 DJI 无人机使用专有的 OcuSync 协议来控制无人机并将视频流传输到遥控器。 大疆销售的Aeroscope是一种允许执法部门定位无人机和操作员的设备。对于这种定位,Aeroscope 会侦听一种称为 DroneID 的特殊信号,该信号由所有 DJI 无人机广播。不幸的是,OcuSync 和 DroneID 都没有公开记录,也没有可用的开放接收器。DJI 的安全白皮书没有明确提及 DroneID 传输、它们的特性或内容。在本节中展示了对 DroneID 广播进行逆向工程的结果,并展示了如何成功提取敏感信息,例如无人机和远程操作员的位置。
通过扫描频段,确定了与高带宽视频馈送和上行链路控制信道分离的无线电广播,数据包大小非常小且周期性出现。怀疑这些是用于定位和识别无人机的 DroneID 广播。 DJI 至少从 2017 年起就一直保持此功能。要求通过开放标准(基于 WiFi 或蓝牙)进行位置广播的无人机规定目前正在起草中,但尚未最终确定。因此,假设最新的无人机使用 OcuSync 协议进行此类广播。通过分析数据包可以了解:
a) 当前一代 DroneID 中包含哪些数据;
b) 是否存在(意外的)安全功能。
为 DroneID 实现了一个实时接收器,使用软件定义无线电 (SDR) 进行信号捕获和基于 Python 的处理链。原型实现包含通过 CRC 校验和进行的信号采集、解调、解码和验证的完整流程。主要执行逐步分析,从无线电信号中导出专有协议的未知参数,这本身就是一个具有挑战性的问题。
接收器实现了实时接收和解码包。此外,它还解决了另一个问题 - 即无人机在 2.4 GHz 和 5.7 GHz 频段之间动态切换。因此,连续扫描两个频段以寻找候选帧,并将这些候选帧送入解调和解码阶段。下图显示了接收器的结构和组件以及接收数据的内部处理,包括频率搜索、信号处理、解调和解码。该系统的细节在下面有更详细的解释:
此部分工作使用了连接到笔记本电脑的 USRP B200mini SDR。 SDR 在 70 MHz 至 6 GHz 的频率范围内同时记录高达 56 MHz 的频率。接收器以 50 MHz 带宽扫描每个波段 1.3 秒,每个波段的批处理大小为 496 Mb。 一旦找到帧,将锁定波段以连续记录 DroneID 帧,仅当无人机切换频道并且在几个周期内没有收到新数据包时才返回扫描。
如上所述,OcuSync 和 DroneID 规范并未公开。根据分析,很明显这些协议使用与 LTE 类似的调制技术和参数。逐步对所有后续参数进行逆向工程。下图显示了单个 DroneID 无线电帧的频谱。一个数据包包含九个标志,包括两个 Zadoff-Chu (ZC) 同步标志(列 4 和 6)。其他标志是 OFDM 数据标志,具有 601 个子载波(600 个数据和 1 个 DC),子载波间隔为 15 kHz。 载波被填充到2的下一个幂次数,以在下一步中应用快速傅立叶变换 (FFT); 这给出了总共 1024 个子载波,总带宽为 15.36 MHz(包括保护频带)。
记录显示数据包每 640 毫秒重复广播一次。注意到一些无人机(Mavic 2 和更早的 OcuSync 无人机)不发送第一个标志(标志 1),这导致更短的帧持续时间为 576 µs。 其他参数保持不变。
将无线电信号转换为比特和字节需要多个步骤:
a) 时间同步以找到 OFDM 标志的边界和频率同步以与承载有效载荷的 OFDM 子载波对齐;
b) 信道估计考虑无线电传输期间的失真;
c) 子载波的解调制(即,将 OFDM 子载波映射到位)。
通过循环前缀的时间同步:Symbol 不能一个接一个直接追加,而是需要在它们之间进行填充以减少标志间干扰。 对于 DroneID,标志之间的间隙由循环前缀 (CP) 填充:每个标志末尾的副本附加在相应标志的开头。这能够应用 Schmidl-Cox 时间同步 - 将移动一个标志长度并具有循环前缀宽度的两个块相关联。原理如下图所示。循环前缀长度为72个样本,标志1和9除外,它们具有80个样本的扩展循环前缀。下图中相关性的峰值显示时域中的标志开始。有了关于确切标志开始的信息,可以使用 FFT 将标志转移到频域 - 来自时域的 1024 个样本导致频域中的 1024 个子载波。同步后,循环前缀不再需要并被丢弃。
通过 Zadoff-Chu 序列进行频率偏移校正:发现标志 4 和 6 总是包含根为 600 和 147 的 ZC 序列。将本地生成的 ZC 序列与实际标志相关联,产生任何载波频率偏移,并应用 用于校正的频移。
副载波解调和比特分配:OFDM 副载波是正交相移键控 (QPSK) 调制的。即,载波信号相移四个可能角度之一,以将信号的消息调制为两位。下图显示了四种不同的相移,产生了四个簇(如果绘制为复数表示)及其各自的位表示。同步和纠错越好,分组越清晰。以下解码步骤将显示位分配是否正确。
前面的步骤将无线电信号转换为比特流,可以对其进行解码以检索实际的 DroneID 有效载荷。通过分析 S1 固件,发现数据 用Gold序列加扰,确定了底层线性反馈移位寄存器 (LFSR) 的种子。此外,它使用与 LTE 规范中相同的子块交织置换表使用turbo编码器进行编码。
使用比特流的解扰和涡轮解码,并将生成的数据映射到如上的DroneID 结构,通过逆向工程在无人机的固件中找到了它。每个数据包中包含的 CRC 校验和与计算相匹配,表明正确恢复了数据。下图显示了成功恢复 DroneID 负载的示例。
本研究检查了各种 DJI 无人机的 DroneID 广播,例如 Mini 2、Mavic Air 2 和 Mavic 2 Pro / Zoom; 这些型号都使用 OcuSync 2.0 协议。然后,使用无人机在户外测试了接收器,并让无人机和操作员保持移动以生成非静态 DroneID 数据包。结果显示,可以成功解码来自所有这些模型的广播。解码后的广播显示了所有位置信息都是准确的,并在每个数据包中更新,从而可以重建完整的飞行路径。定位无人机和操作员只需要一个 DroneID 数据包。可以解码的数据包越多,的飞行路径分辨率就越高。使用匹配的 CRC 计算检测到的帧、解码尝试和成功解码的百分比,并将其与预期数量(基于 640 毫秒的 DroneID 间隔)进行比较。初步测量表明,对于所有测试的无人机,大约 37% 的预期数据包被正确解码——这意味着每两秒接收一次位置更新。
接收器范围限制在大约 10 m 的范围内,并且对发生的干扰很敏感,如相邻的 WiFi 站。这种影响可归因于的接收器链专注于对信号进行逆向工程,而不是针对性能或高范围进行优化。测试表明,在接收器范围内可以成功可靠地接收、解调和解码 DJI 专有的 DroneID 传输。最重要的发现是,信号没有加密。观察表明,DroneID 准确地揭示了无人机、返航点和远程操作员的位置。
收到的 DroneID 数据包表明对无线物理层数据包结构的假设是正确的,并且与从无人机固件中恢复的结构相匹配。此外,解码数据包确认成功修改了无人机的序列号,这允许恶意用户混淆他们的身份。前图显示了完整的 DroneID 信息的示例。
现在可以观察和解码 DroneID 数据包 - 这在以前如果不访问 DJI 的 Aeroscope 接收器是不可能的 - 从而测试是否可以禁用 DroneID 或伪造传输位置。接下来进行了两个实验:
a) 操作员位置欺骗;
b)通过未记录DUML命令禁用 DroneID。
对于操作员位置欺骗,使用了一个非 root 的 Android 手机和来自 Google Playstore的名为“Fake GPS”的应用程序。在欺骗应用程序中设置虚假位置后,切换到 DJI 应用程序,启动无人机并打开接收器。接收器开始查找并解码有效的 DroneID 数据包,其中无人机的位置设置正确,但远程操作员的传输坐标设置为虚假位置。该应用程序允许模拟随机运动,也可以在收到的 DroneID 数据包中验证这一点。无人机、返航点和操作员伪造的 GPS 位置之间的距离没有发挥作用。因此得出结论,大疆没有对坐标的一致性进行检查,并且可以成功进行远程操作员的位置欺骗。
此外,在的安全分析过程中发现了一个公开未知的 DUML 命令,该命令似乎允许配置和禁用不同的 DroneID 值。根据 DJI 的说法,此命令是内部 API 的一部分,不应在外部提供。这已在最新模型中修复。使用的实时 DroneID 解码器,可以确认此命令不会禁用 DroneID 数据包,而是将数据包中的相应值替换为值“fake”。
在本节中假设一个主动攻击者,考虑攻击者可以物理访问无人机、其 RC 以及连接到 RC 的智能手机的场景。假设此攻击者的目标是拒绝其服务或绕过 DJI 对无人机实施的反制措施。例如他们可能希望在飞行过程中使无人机坠落,禁用 DroneID、地理围栏或其他软件限制以便飞越受限区域。实现这一目标的第一步是能够提取在无人机上运行的固件,然后提升权限。
尽管假设可以物理访问无人机,但这主要是为了分析过程本身。正如展示的那样,一旦发现有趣的命令,几乎所有命令都可以通过无线方式发送到无人机。换句话说,还分析了这种主动攻击者模型的一个变体:攻击者只破坏了连接到 RC 的用户智能手机(这在飞行期间是正常的),但没有对无人机本身的物理访问权限。
由于无人机是具有多个接口、不同固件文件和不同架构的复杂信息物理系统,因此需要对其应用多种类型的分析方法。六个可以攻击的目标包括:无人机硬件、无人机底盘和包、地面控制站、无线电通信信道、操作员和云服务。这项工作中区分了硬件和固件,并对两者进行了详细的分析。
在可以使用自动动态分析方法(例如模糊测试)之前,事实证明这些方法对于有效查找软件和固件中的错误具有无可估量的价值,必须了解被测目标的复杂性。例如,需要识别通信接口和协议。为此,手动对固件进行静态分析并分析无人机的硬件。除了为的自动动态分析提供基本信息外,还通过这种方式发现了几个关键的安全漏洞。基于已识别的 DUML 通信协议,随后设计了一个模糊测试工具来自动搜索更多漏洞并发现其中的大量漏洞。所有调查结果均已披露给供应商 DJI 并得到其承认。
为了进行详细分析,调查了以下 DJI 硬件设备:DJI Mini 2、Mavic Air 2 和 Mavic 2 Pro / Zoom。 此外,研究了遥控器 RC231 / RC-N1(应用于最新大疆无人机,包括 DJI Mini 2、Mavic Air 2 和 Mavic 3),并复现了在最新的 DJI 无人机 Mavic 3 上发现的错误。
在可以安装任何自动化分析技术(例如模糊测试)之前,需要了解的目标。
将手动静态分析应用于无人机固件的不同部分,例如飞行控制器,并发现有关各种特性和无人机功能的关键信息。分析使用了标准工具,特别是 Ghidra、Binwalk、十六进制编辑器和 dji-firmware-tools。手动静态分析揭示了有关 DUML 结构的信息,为在后续部分中描述的动态分析奠定了基础。除了为了解和分析无人机提供基本信息外,手动静态分析还揭示了一个漏洞,即能够绕过 DJI 的固件签名并在设备上获得特权shell。
S1 SoC的固件可以在无人机上以sparrow_firmware的形式找到,也可以在网上找到的固件更新中找到;它由不同的二进制文件组成。该固件包的一部分是所谓的“SDRH”配置文件。这些文件在设计上既没有签名也没有加密,对引导加载程序的手动静态分析表明这些文件指定了内存地址及其值。假设 DJI 使用它们在收发器固件中安装补丁,而无需重新刷新整个固件。DJI 没有透露任何细节,也没有在安全白皮书中提及这些文件。引导加载程序读取这些文件并使用指定值修补 RTOS RAM 的已定义内存地址。使用手动制作的 SDRH 文件允许在启动期间修补固件,这发生在验证固件签名之后。这种方法完全绕过了固件签名过程,并使能够提供精心制作的 SDRH 文件的攻击者能够对固件代码进行任意更改。
上表列出了受此签名绕过影响的无人机和 RC(Sig.Bypass)。 Mavic 3 和 Mavic 2 Pro 不受影响,因为它们使用与易受攻击的 S1 不同的收发器。根据漏洞披露,大疆已将此漏洞的严重性指定为严重。
为了寻找将 SDRH 文件传送到无人机的机制,研究了无人机的不同二进制文件,并发现固件通过类似快速启动的系统闪存到 SoC 的 RAM。 这要求引导加载程序处于正确的状态以接受这些快速引导命令。通过对无人机文件系统的系统初始化二进制文件进行逆向工程,发现收发器的引导加载程序可以通过发送不同的正确格式的数据包来触发。在引导期间通过 USB 将此类数据包发送到 RC 可启用快速引导模式。通过解锁 fastboot 模式,可以使用它来上传(签名的)收发器固件文件和(未签名的)SDRH 文件。这允许攻击者将恶意 SDRH 文件与原始固件文件一起包含在内,并转移收发器固件的控制流。上传这些 SDHR 文件不需要授权,只需要对无人机或 RC 进行物理访问。
在接下来的步骤中,分析 Sparrow 收发器固件并发现一个 UART 接口。收发器固件通过此接口公开一个shell。然而,这个shell在生产无人机上是封闭的。硬件通过可能是熔丝位的方式向固件指示其生产状态。在无人机固件中找到检查此位的代码。通过上传修补固件代码的自定义 SDRH 文件以禁用此检查,在固件逻辑中重新启用 UART shell。
为了与手动静态分析的结果相匹配,检查了无人机硬件的通信接口,包括前面提到的 UART 接口。本阶段目标是在硬件级别验证的软件发现,并在收发器固件上获得交互式shell。使用自定义 PCB 工作站进行硬件分析(参见下图),它允许探测不同的连接器。使用逻辑分析仪和示波器来识别固件中暴露的 UART 接口。
由于最新的 DJI 无人机(如 DJI Mini 2、Mavic Air 2)及其遥控器共享 Sparrow 固件,因此选择这些设备作为目标。在这里,RC 的硬件分析被证明是最容易访问的,即使在设备打开时也可以进行测试。在对 RC231 遥控器硬件的调查中,发现收发器固件使用的 UART 端口在打开设备后的前两秒内处于活动状态。
基于之前手动静态分析的发现 - 即固件文件的修补,导致收发器固件无限期地保持 UART 连接打开。这允许连接到收发器 UART shell。在这个 shell 上,确定了执行任意内存读取、写入的命令和生成 shell 的命令,从而授予提升的权限——禁用反制措施和软件强制限制的先决条件。
鉴于之前手动静态分析的理解和观察,现在可以建立一个自动化的方法来发现错误。有效发现错误的最有效技术之一是模糊测试,这是一种通过向测试目标提供(可能无效的)输入来识别软件故障的自动化方法。它的巨大成功激发了许多不同的研究方向,以改进模糊测试的各个方面。最重要的创新之一是引入了覆盖率反馈,其中目标被用来报告特定输入执行了哪些代码。这允许fuzzer观察各个输入如何影响控制流,从而指导模糊测试过程。现代fuzzer通常依赖于在编译阶段注入的工具,因此需要访问源代码。如果源代码不可用,fuzzer可以使用动态二进制检测(DBI)、二进制重写或英特尔 PT等硬件功能来检测二进制可执行文件。但是,它们要么需要特定的硬件,例如英特尔处理器,或对执行环境做出假设,如依靠操作系统提供的已定义接口。不幸的是,在嵌入式设备上运行的固件通常不会公开这样的接口。为了fuzzing此类固件 blob(通常需要特定的硬件配置),最先进的模糊测试依赖于重新托管,即固件环境的(部分)模拟,因为在实际硬件上进行模糊测试通常设置起来很复杂,提供的反馈不足并且扩展性不好。不过,它还是必须有访问该固件的权限。
虽然对无人机的模糊测试似乎是分析其安全性的必然方法,但面临着障碍:既无法访问源代码也无法访问完整的固件。因此,并发模糊测试方法不适用于 DJI 无人机 - 必须使用实际硬件进行模糊测试,并且无法访问覆盖信息。
DUML 协议被确定为合适的模糊测试目标,因为该协议用于启用整个无人机的配置。此外,所有无人机组件都使用该协议进行内部通信,并且通过 USB 接口,攻击者可以通过物理访问随时使用该协议。该协议代表了潜在攻击的有吸引力的目标:该无人机系统中的漏洞为攻击者提供了强大的利用原语。
DUML 协议:基于对 DUML 的分析,设计了一个使用自定义语法的黑盒fuzzer,即fuzzer知道为其生成输入的规范,但不受覆盖范围的指导。由于无法访问源代码、完整固件或能够模仿 DJI 特定硬件的模拟器,因此需要对无人机本身进行模糊测试。由于 DJI 无人机和遥控器提供了一个 USB 接口,因此可以通过 DUML 协议进行通信,从而为fuzzer选择该接口并观察其行为。由于没有覆盖反馈,fuzzer在黑盒场景中只能从外部观察无人机的行为。为了改进对不会导致崩溃的漏洞的检测,提出了一种基于智能手机应用程序 UI 差异的新型bug oracle,它连接到 RC 并用作无人机配置、传感器读数和相机反馈的屏幕。例如,当fuzzer更改序列号时,bug oracle可以自动标记此行为。
通过 DUML 进行通信需要遵守 DUML 协议。在没有测试实际程序逻辑的情况下,在早期解析期间可能会拒绝不注意规范的fuzzing输入。每个 DUML 命令都由字段 src、dest、cmdType、cmdSet 和 cmdID 组成——所有这些字段均由一个字节表示。fuzzer的一种可能性是为每个字节迭代所有 256 个值,这将花费太长时间并测试许多不必要和不存在的命令。为避免这种情况,将这些字段的可能值缩小到已知的来源、目的地和命令集。这使能够以一种确定的方式详尽地测试剩余的命令:从命令集中生成所有可能的 DUML 命令,并测试字段 commandid 的所有 256 个值。只有命令的有效负载可以包含任意字节,仅受 DUML 数据包的长度限制。为此字段生成(并记录以允许确定性地重放测试命令)随机有效负载。在发送数据包之前,为数据包计算正确的校验和,以便测试校验和解析之外的程序逻辑。通过这种方法,可以识别导致无人机坠落、断开连接或其他物理故障的任何 DUML 命令。请注意,并非所有错误都表现为崩溃或物理上可观察到的故障。相反,某些命令可能会导致内部错误或损坏设备上的其他数据。
UI oracle:为了克服这个限制,引入了一个更精确的bug oracle:UI Oracle。 DJI 无人机与连接遥控器的智能手机紧密相连。智能手机用于显示无人机的摄像头画面,并允许用户检查传感器读数等值,或更改设置。本着广泛部署的测试策略的精神,例如,由 selenium 等框架实现,可以在模糊测试活动期间自动导航无人机的用户界面,以识别非崩溃的行为。例如,可以检测fuzzer何时更改设置或触发解析器错误,这些错误会在 UI 中报告为警告消息。
输入块:由于与无人机的通信(请求-响应)很慢,因此仅发送fuzzing的输入(即命令)而不等待响应。与常规的模糊测试迭代相比,UI oracle循环(遍历 UI 并识别非崩溃错误)很慢。因此,选择将对 UI oracle的查询数量减少到最低限度。本研究的fuzzer不单独考虑输入,而是将所有可能命令的输入空间拆分为输入块,其中每个输入块包含 130,000 个命令。
fuzzing循环:fuzzer通过 USB 串行设备将这些输入一个一个地发送到模糊测试目标(上图中的➊)。无人机处理每个命令并与 RC 同步 (➋), 例如更新状态数据。如果fuzzer观察到无人机的固件崩溃(➌),不能将此崩溃与最后一个命令相关联,因为不等待对每个命令的响应; 相反,重新测试最后 5, 000 个命令以识别有问题的命令。
为了优化此过程,执行如上算法中概述的二进制搜索算法。给定一组命令 C,连续将命令分成两个大小相等的组 CA 和 CB。 执行第一组中的所有命令并验证该组是否包含崩溃命令。如果是这样,对第一组重复这个过程。如果不是,丢弃该组并继续第二组。这一直持续到只留下并返回一个命令 - 触发命令,这样可以在 log(n) 步中识别导致崩溃的命令。
如果没有观察到崩溃并且输入块中的所有命令都已发送,则必须检查意外行为。为此,fuzzer向 UI oracle查询偏差 (➍)。如果 UI oracle发现偏差,也不能直接将此发现与发送的特定命令相关联。相反,需要使用算法重新测试最后一个输入块 - 不检查崩溃,而是查询 UI oracle并检查是否可以观察到 UI 偏差。总之,根据识别出的故障,要么使用传统的crash oracle来验证是否发生了崩溃,要么使用 UI oracle来验证是否可以观察到 UI 内的偏差。
fuzzer和 UI oracle在约4, 000 行 Python 代码中实现。fuzzer具有两种操作方式:它可以通过串行连接或无线连接到 RC 的串行接口时对无人机进行模糊测试,后者使能够识别可以远程触发的崩溃。在空中进行模糊测试时,fuzzer会使用具有已知返回值的特定命令定期检查无人机是否还活动。此外,fuzzer检查是否有除用于 UI oracle的 Android 手机之外的任何 Android 调试桥 (ADB) 设备。
UI oracle使用 Android 内部工具(如 ADB 和 uiautomator)以自动方式与 DJI 应用程序交互,以确定应用程序的状态和应用程序界面中报告的数据是否符合预期; 偏差表明fuzzer设法识别了一个有趣的命令。预先定义所有要检查的值可以防止定期更改值(例如电池电量)导致误报。
使用三种不同的 DJI 无人机和一个遥控器测试了fuzzer:
• Mavic Air 2,固件:01.01.0610
• DJI Mini 2,固件:01.03.0000
• Mavic 2 Pro,固件:01.00.0770
• RC231 (RC) + Mavic Air 2,固件:01.01.0610
运行fuzzer的主机必须与 Android 手机处于同一 WiFi 网络中,无人机必须连接到该计算机。使用智能手机的 WiFi 热点进行测试,第一次启动时fuzzer 需要初始化智能手机、启动 ADB 服务器并配置 ADB WiFi 连接。要使用带有应用程序的手机作为 UI oracle,手机需要连接到 RC,并且需要建立 RC 和无人机之间的连接(OcuSync)。使用运行 DJI Fly 应用程序 (v1.6.6) 的 Android 11 root OnePlus 8 Android 手机,Mavic Air 2 和 DJI Mini 2 都使用该应用程序。运行四个独立的模糊测试实验包括:
1) Mavic Air 2 +,RC231,UI oracle
2) DJI Mini 2 + ,RC231,UI oracle
3) 没有 UI oracle的 Mavic 2 Pro
4) 逆向的RC231 + Mavic Air 2,RC 和无人机通过 OcuSync 连接
使用 UI oracle测试 Mavic Air 2 和 DJI Mini 2。由于 Mavic 2 Pro 使用不同的旧应用程序,目前无法使用UI oracle,因为它是专门为最新大疆应用程序量身定制的。为了减轻工程负担,避免将oracle适配到已弃用的旧应用程序。第四次模糊测试活动调查了通过 RC 对无人机进行空中模糊测试是否可行。
控制器也可能因为达到无效状态或无人机的收发器崩溃而丢失无人机的信号。这种持续在串行接口上接受命令但未连接到控制器的状态只能在 UI oracle检查应用程序时检测到。如果 UI oracle检测到没有无人机连接,fuzzer会尝试重新启动模糊测试目标。最后,UI oracle本身也有限制和要求:需要定义在模糊测试活动期间应该检查的所有有趣的值。需要进一步考虑常见的非严重错误消息,例如 GPS 信号较弱时出现的错误消息。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2023-3-7 05:57
被CDra90n编辑
,原因: 修改错别字