攻防速写|击穿DJI大疆控制设备的致命漏洞

当物流无人机穿梭楼宇、测绘设备描绘城市脉络,低空经济的神经末梢正以毫米级精度勾勒未来。DARKNAVY团队始终关注无人机安全防线的构建与突破,在研究中发现了DJI遥控设备中的致命漏洞利用链,这一近年来罕见的安全缺陷彻底击穿了DJI遥控器中的安全防线。我们如何协助行业领军者DJI高筑安全护城河?这一漏洞又揭示了怎样的潜在风险?欢迎阅读《攻防速写|击穿DJI大疆控制设备的致命漏洞》

随着无人机及其控制系统日趋复杂,现代无人机系统早已不止于飞行器和遥控器本身,还包括无人值守的无人机机场、云端管理平台等部分,使管理者足不出户便能远程调度空中作业。不仅能部署在大漠上定期巡视线路、也能在城市中进行自动化巡逻。集控制和起降功能于一体的无人机机场,成为远程调度的核心节点。用户不仅可以通过遥控器手动操作设备,还能够通过与云端连接的机场,对无人机下发飞行任务。

20250326103017570-图片

当我们聚焦整个无人机自动化的实现时,发现无论是遥控器、机场还是云端与无人机自身,均存在多种攻击面。

20250326103040968-图片

本篇攻防速写,我们将着重介绍两个部分:

    • 在各种DJI设备中使用的DUML协议

    • DJI遥控器中由5个漏洞组成的利用链

DUML协议

DUML(DJI Universal Markup Language)协议是DJI的核心协议之一,用于各种DJI设备之间、DJI设备中不同组件之间的通信,统一的DUML协议格式,使得DJI设备能更高效的处理由不同信道发来的各种消息。我们分析了多种DJI设备上的DUML相关程序,对协议内容进行了深入的探索。DUML支持多种版本的协议格式和通信通道,各版本有相应的编解码器负责将其编码成二进制格式以及从中恢复,编码后的内容包含一个新的头部,携带了协议版本、总长度、checksum等信息。DUML数据包中包括以下关键字段:

20250326103145160-图片

machine和host类似于网络协议中的IP和端口,DUML处理程序根据设备上的dji.json文件创建路由表,按照其中配置根据machine和host将DUML数据包进行转发或者分发到具体的consumer。seq id是数据包的ID,可以使用四元组(machine, host, msg id, seq id)区分数据包,以及识别数据包的响应包。attributes包含了数据包的额外属性信息,例如是否加密。msg id由cmd set id和cmd id两个部分组成,主要用于区分不同的功能。payload就是DUML上层应用自己规定的载荷内容。

在黑盒测试的情况下,由于难以获取dji.json,无法得知存在哪些有效的msg id (cmd set id / cmd id),因此不易分析设备中所提供的功能接口。我们发现DUML响应数据包在正常功能接口与不存在功能接口之间存在差异,因此可通过类似网络端口扫描的方法探测有效msg id:

    • DUML数据包的attributes中的一个属性会影响DUML处理程序在收到数据包之后的处理方式。将其设为某个值(attributes = 0b0_01_0_0000)时,DUML处理程序会在相应msg id有效(已注册处理函数)时先响应一个ACK数据包,且payload第一个字节为1,因此可以根据是否收到符合该模式的ACK数据包来判断msg id的有效性。

20250326103208143-图片

探测DUML功能代码片段

通过DUML分析设备所支持的功能列表,能够为我们进一步分析设备所暴露的攻击面,并寻找其中存在的安全问题。然而,DUML需要设备与攻击者掌控的设备建立起连接后,才能够进行通信。

遥控器

遥控器和机场与无人机之间通过物理链路层协议OcuSync来进行远距离控制与数据传输,而如果能够“拿下”遥控器或者机场,无疑能够帮助我们进一步开展对运行状态无人机的研究。于是,我们买了一台DJI RC Plus遥控器…

20250326103231589-图片

DJI RC Plus 遥控器

DJI RC Plus上运行的是一个轻度定制的Android系统,可以安装APK应用。其中包含大量的DJI服务,从应用层的“大疆农业”,到与无人机控制相关的系统服务,再到可信执行环境(TEE)中的DJI TA。

20250326103244476-图片

DJI RC Plus 使用的Android系统

DJI RC Plus通过层层防御,筑建了对无人机遥控的安全体系。而其中核心便是存储在TEE中的设备根密钥(rootkey)。之所以被称为rootkey,是因为它是系统中大量关键密钥的基础。DJI TA使用密钥派生功能(Key Derivation Function,KDF),通过rootkey派生出各种密钥,供其他组件在认证、加密过程中使用。如此一来,便能够更加方便高效的管理系统中的各种密钥,各种密钥的安全性也都依赖于rootkey的安全性。rootkey自然就得到了更多的保护。其只会被DJI TA使用,且不会被传出TEE。而且它在未使用时,使用硬件唯一密钥(Hardware Unique Key,HUK)加密存储在设备的高安全存储区域RPMB(Replay Protected Memory Block)中,使得攻击者即使拥有先进的芯片级物理攻击能力,也难以获取rootkey。

20250326103316257-图片

DJI RC Plus 架构

本文就将介绍,我们是如何通过安装一个APP串联5个漏洞,绕过层层防御机制,在TEE中执行代码,并获取到RC Plus遥控器中的rootkey。

01 CVE-2023-20963 “n-day”

我们在深蓝洞察“最不可赦”的漏洞利用中分析了CVE-2023-20963的细节。

CVE-2023-20963是Androidandroid.os.WorkSource类型中的Parcel Mismatch漏洞。攻击者可以通过利用这个漏洞实现以system权限发送任意intent的LaunchAnyWhere能力。关于CVE-2023-20963的利用方式公开分析较多,这里不再赘述。

但为什么已经被修补的CVE-2023-20963在新版DJI RC Plus上依然能够被利用呢?尽管Google针对受影响的Android 11、12、12L、13均发布了漏洞补丁,但是该漏洞实际上早在Android 9就已经被引入。当时Google已经结束了对Android 9和10的安全补丁支持,故这两个版本中的任何漏洞都不会再收到补丁推送。

20250326103408226-图片

而DJI RC Plus的系统版本正是Android 10。因此我们通过DJI RC Plus上的”n-day” CVE-2023-20963获取到了以system权限发送任意intent的LaunchAnyWhere能力。

02 LaunchAnyWhere → system任意文件读写

system权限发送任意intent能造成的影响比较有限,但如果…

20250326103424192-图片

Settings APP 中的root-path FileProvider

我们在系统应用Settings APP中发现其提供了一个root-path的FileProvider,能够访问根目录下的任意文件。通过组合LaunchAnyWhere和root-path FileProvider,我们便实现了system权限的任意文件读写。

03 SELINUX “放行”

在Android系统中,不仅通过用户(uid)区分不同的权限,还使用了SELinux进行更细粒度的文件权限管理,通过规则限定了只有与文件标签配对的特定上下文进程才能够访问文件。但是…

20250326103449496-图片

RC Plus中并未开启SELinuxRC Plus中并没有将SELinux配置为Enforcing模式,因此其中的SELinux防护实际上并没有生效。使得我们能够通过非常古早(2017年)的利用手法:覆盖/data/dalvik-cache/目录下优化后的dex字节码文件,将system任意文件读写转化为system任意代码执行。

通过system代码执行获取的反弹shell不仅如此,由于SELinux未开启,使得system_app上下文原本无法访问的TEE交互驱动(/dev/qseecom)能够被我们访问到。

20250326103811763-图片

RC Plus中的SELinux规则

至此,我们通过Android侧的3个漏洞获得了与TEE中TA交互的能力。那么下一步…

04 BYPASS TA ASLR

要想在TA中实现任意代码执行,绕过ASLR是非常关键的一步。我们在DJI TA中发现了一个数组访问越界(OOB)漏洞,能够越界读取栈上的数据并返回。

20250326103730940-图片

OOB漏洞伪代码

通过这个OOB漏洞,我们能够通过dump栈上的返回地址,泄露TA的加载地址,从而绕过ASLR。

20250326103657625-图片

泄露出的TA基地址

05 STACKOVERFLOW

我们在DJI TA中又发现了一个栈溢出漏洞,能够实现任意长度任意内容的栈溢出。

20250326103636675-图片

栈溢出漏洞伪代码

于是,我们利用漏洞所在函数的父函数栈帧通过ROP实现代码执行:

    • 读取rootkey所在的rpmb

    • 使用HUK进行解密

    • 将明文rootkey拷贝到输出的缓冲区中

    • 使程序正常返回

20250326103609319-图片

最终,我们通过组合5个漏洞实现了在DJI遥控器 RC Plus 的TEE中任意代码执行能力,并获取了遥控器的root key。通过root key,我们便能派生出遥控器在认证、加密时使用的各种密钥,从而对遥控器与无人机之间的通信开展进一步分析。

这一系列漏洞,我们已于2023年12月9日提交给DJI SRC,DJI SRC确认为“致命级别”漏洞并进行修复。

20250326103523889-图片

参  考:[1] https://www.ndss-symposium.org/wp-content/uploads/2023/02/ndss2023_f217_paper.pdf

[2] https://www.digidow.eu/publications/2021-christof-masterthesis/Christof_2021_MasterThesis_DJIProtocolReverseEngineering.pdf

[3] https://www.nowsecure.com/blog/2017/06/16/remote-code-execution-as-system-user-on-samsung-phones/

[4] https://mp.weixin.qq.com/s/lsZvfaFxI9mNQtT-x3QORg

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容