本repo用于记录本人和Yuhang Ji在LoCCS展开的短暂的无人机安全研究内容,以供参考 按照时间顺序记录并归档
- 无人机安全(drone security、UAV security)究竟在研究什么?研究意义又是什么?
- 与其说是在研究无人机,不如说是在研究一个复杂终端,这个复杂终端包含通信、计算、存储、视觉、运动等多功能;
- 研究意义在于,无人机的出现扩大了原有攻击的范围,假如攻击者拥有对一台无人机的完全控制权,则能将侧信道、中间人等传统攻击方法的适用条件进一步放宽;同时,无人机在军用民用等领域都有着愈发广泛的用途;
- 无人机安全层次如下图所示(该幻灯片为本人制作,PDF版本可见repo中):
- 本研究主要希望了解无人机中的密码协议与认证系统,研究是否能通过各种攻击手段获取系统密钥,从而达到远程劫持或干扰正常无人机飞行的目的。
-
由于目前DJI(大疆)基本占据了无人机消费市场的大部分份额,而且作为代表企业,会比厂商更加重视安全应用,从而会给予我们更多的研究机会;
-
目前,大疆在日常消费领域的主流机型就是 Mavic与Phantom,经过多次了解调研后,得到最终的无人机采购清单:
-
《芜 湖 飞 机 场》
- 阿里的谢君(vessial)在2017年针对大疆Phantom v4 1.0进行过完整的分析与测试,ppt见repo
- 在该工作中,谢君首先对无人机进行了拆解,并对飞控、主板、电池等模块进行了深入分析,涉及的技术栈为:
- 信息搜集
- 电路分析和焊接
- 固件提取
- 二进制文件逆向与分析
- 系统提权
- 无线信号处理
- 板上协议分析
- 最终,谢君老师的研究成果主要为:
- 明确Phantom v4 1.0(含遥控器)中的主要部件及芯片型号:32个子模块,飞控及SoC型号
- 对无人机飞行器系统提权
- 提取遥控器MCU固件,发现飞行器与遥控器之间使用5字节的配对码进行识别
- 无人机电池模块存在漏洞
- 无人机板内协议分析:DUML,即飞行器不同模块之间的通信协议
-
SecAuthUAV: A Novel Authentication Scheme for UAV-Ground Station and UAV-UAV Communication
-
Penetration testing a civilian drone
-
DJI ANDROID GO 4 APPLICATION SECURITY ANALYSIS
-
Security Analysis of DJI Phantom 3 Standard
-
Security Vulnerabilities of Unmanned Aerial Vehicles and Countermeasures: An Experimental Study
-
Addressing Security Concerns with Chinese Drones and DJI Products
无人机安全领域的paper多集中在对无人机的识别、检测、干扰等,鲜有深入无人机系统内部进行测试和实验的工作
- 需提前(淘宝)购买相应的拆解工具套装,youtube上有若干拆解视频,需提前了解清楚内部的大致结构,防止拆坏
- 几点拆解注意事项:
- 拆解前以及拆解时对各部分进行拍照留存
- 注意螺旋桨电机以及下方的塑料灯罩是可以取下的,取下后才能打开外壳
- 打开外壳时需要一些蛮力,但有翘片辅助最好
- 小心各个地方的连接处被折断
- 拆解内部电路板时,小心将串口与线缆毁坏
- 注意对螺丝、线缆等部件的分类存储,若后续需拼回无人机并上电,则更需仔细注意
- 遥控器拆解时注意隐藏螺丝的位置
- 拆解结果:
- 既然已对无人机的内部结构有了明确认识,现在就应对该系统进行分析和测试,下面是本人和Yuhang Ji进行的几次尝试
- 参考vessial老师的成果,包含飞行器与遥控器配对认证的代码是在遥控器的MCU中,该MCU是NXP LPC 1549,遂展开分析
- 阅读芯片手册后,发现从芯片的SWD接口中能直接读出固件,因此我们展开了此方面的尝试
- 由于可以采购到该芯片的官方开发板,因此可现在开发板上尝试将固件编译-提取-分析这条路走一遍
- 开发板型号为OMU13056,官方配套IDE为MXUPresso;提取固件时需要jlink debugger(淘宝购买),上位软件为jlink
- 编译IDE自带示例为固件烧写入开发板,根据芯片手册中SWD的工作流程和配置,连接后可提取得到烧写入的二进制文件
- 拖入IDA并学习Arm反汇编,可逐步恢复出其中逻辑
- 参考:https://notes.sjtu.edu.cn/0W1OnnS9RFO4gmCnXw7TfQ?view= by Xuangan Xiao
- 因此,该闭环测试说明,整个工作流程和环境是没问题的
- 下面对真正的芯片进行提取。首先需用热风枪将MCU芯片吹下(学习相关操作),并买入芯片测试座以暴露出各个引脚(注意封装格式)
- 但此时套用之前的流程并不能分析,因为开发板中实现了能驱动SWD的最小电路,但裸芯片并未实现,因此需根据芯片手册自行焊接一个最小工作电路;
- 焊接、飞线等完成后,得到了一个芯片的最小工作电路(中间是芯片的测试座)
- 之后,就能用原来的一套jlink debugger按引脚连接,并尝试读取
- 然而,反复测试后发现,DJI遥控器的芯片施加了读保护,直接connect failed(因为我们对另外购买的新芯片进行测试,发现可成功连接,即这些工作电路是正常的)
- 此时,在原来的开发板上添加一读保护字段后再进行闭环测试,同样会发现connect failed,这进一步验证了以上结论
因此,到这步我们发现,DJI将自己的芯片做了很好的保护,基本无法用这种方法获得固件
vessial老师在2017年实验时就已发现飞控芯片加了读保护,但遥控器并没有;现在看来,DJI已经做了全套保护
至于能否从网络侧(如截获固件更新时的流量)等手段提取固件尚不可知,但由于DJI无人机系统过于复杂,想拿到底层芯片的内容,应该是相当困难的
- 然而,经多方搜索我们发现,该网站http://dankdronedownloader.co.uk/DDD2/app/中似乎提供了DJI各个版本的固件(虽然不知道是如何拿到这样完美的非加密固件的)
- 并且,对DJI逆向的「老鸟们」已经开发了一套分析脚本https://github.com/o-gs/dji-firmware-tools/wiki#introduction,因此我们尝试使用其中的脚本对网上的固件进行分析
- 对飞行器固件分析后发现,其中的确包含以4位ID标识的30个左右的子固件,binwalk进一步分析,只有两个文件可解出有效内容。
- 这些内容中包含了dji_sys的ARM二进制文件,然而分析后发现,其中大多数都是对log以及设备(/dev)的操作,缺少实际的业务代码,且无法动态调试,无法获取该文件所处机身的哪个模块
但该部分之所以无法推进可能由于我们的二进制分析能力较弱,其中也许还有很多有价值的信息未被挖掘
- 最终,只能寄希望于将无人机系统root掉,并拿到shell,以动态分析系统内进程了
- root方法也是按照比较主流的“提取-修改-烧回-上电”的流程,详细步骤可参见vessial老师的ppt
- 注意:
- 吹EMCP芯片时,注意该芯片为BGA封装,需提前了解BGA封装、焊接的细节(如锡球、焊网等)
- 先对类似BGA芯片进行实验再尝试板上芯片
- 然而,这些BGA封装的芯片在与电路板接触时,芯片四周被封上了一层透明胶状物,导致焊膏无法渗入,从而无法软化芯片引脚
- 经多次尝试后,依然无法将EMCP芯片吹下,推测根本原因可能就是DJI在BGA封装芯片下添加的这一层保护物
- https://github.com/o-gs/dji-firmware-tools/wiki#introduction
- http://dankdronedownloader.co.uk/DDD2/app/
- https://libraries.io/github/o-gs/dji-packet-dumps
- https://dji.retroroms.info/cn/about/start
- 多结合关键词搜索
- DJI基本上将2017年谢君老师成功利用的弱点都封堵干净了,现在难以对这个实际黑盒对象展开深入分析
- 也许华强北或者其他专业分析大神,能解决我们上述的问题
- 接下来如果有人继续分析,个人认为还是两条路
- 大力出奇迹:继续尝试root,或者分析纷杂绕乱的二进制文件
- 四两拨千斤:从通信、app等角度,推断或截取某些安全敏感数据
- 个人认为现在DJI安全研究,就像在吃椰子,也许真正的安全会协议非常简单。
目前,由于DJI在无人机上设置的层层阻碍,导致实验难以进行。因此该研究计划将暂时中止,但如果有其他尝试机会或者有其他资源,也许会继续进行该项目。