1. 课程导入

无人机从航拍玩具演进为物流、巡检、测绘、应急通信的核心平台,其安全边界也随之从“飞控是否稳定”扩展到“链路是否可信”。一架四旋翼在飞行中同时存在多条无线通道:遥控链路、图传链路、遥测链路、GNSS 与蜂窝/卫星回传。其中,MAVLink 承担了飞控与地面站、机载计算机、云平台之间的指令与状态交换,是整条数据链的“神经中枢”。一旦这条链路被伪造、篡改或重放,攻击者可能在不接触飞机的情况下接管航向、触发返航、注入错误航点,甚至让飞控进入不可恢复状态。

一、安全形势:从“能飞”到“可信地飞”

传统无人机安全关注的是可靠性:链路中断要能自动返航,电池低电量要能告警。而安全攻防关注的是对抗性:攻击者可以主动发射信号、伪造身份、重放历史报文。常见威胁可归纳为四类:

  • 窃听:使用 SDR 设备捕获 433MHz/915MHz 遥测,读取航点、坐标、电池与飞行模式。
  • 注入:向链路写入伪造的 MAVLink 指令,如强制解锁、切换 GUIDED 模式、上传恶意航点。
  • 重放:录制合法地面站的起飞或返航指令,在适当时机重放,绕过部分无时间戳校验的系统。
  • 中间人:在数传电台与飞控之间插入转发节点,双向篡改遥测与指令而不易被察觉。

这些威胁并非理论推演。公开研究中,多款消费级与行业级无人机被证明可在数秒内完成遥测解析与指令注入。其根因在于:MAVLink 1.0 设计之初以轻量、低带宽、易实现为首要目标,默认不加密、不鉴权、不防重放。因此,理解 MAVLink 的安全短板,是构建防护方案的第一步。

二、MAVLink 的协议地位与安全缺口

MAVLink 是一种面向资源受限设备的二进制消息协议,采用固定帧头、消息 ID、载荷与校验和结构。它运行在串口、UDP、TCP 以及数传电台之上,连接飞控(如 PX4、ArduPilot)、地面站(QGroundControl、Mission Planner)和机载伴飞计算机。其安全缺口主要体现在:

  • 帧头与消息 ID 明文可见,攻击者可快速识别消息类型。
  • 校验和仅用于检错,不具备密码学完整性,无法抵抗篡改。
  • 无会话与身份概念,任何能发送合法帧的设备都被飞控视为“地面站”。
  • MAVLink 2.0 引入签名机制,但默认关闭,且密钥分发与轮换缺乏工程规范。

核心判断:MAVLink 的安全不是“加一层 TLS”就能解决。它需要在协议帧、会话管理、密钥生命周期和飞控策略四个层面协同设计。

三、课程目标与学习路径

本课程面向无人机研发、安全测试与系统集成工程师,目标是让学员能够独立完成 MAVLink 链路的威胁建模、安全加固与验证。学习路径分为五个阶段:

  1. 协议基础:掌握 MAVLink 1.0/2.0 帧结构、消息 ID、心跳与常用指令。
  2. 攻防实验:使用 SDR、pymavlink、MAVProxy 复现窃听、注入与重放。
  3. 鉴权机制:理解 MAVLink 2.0 签名、HMAC-SHA256、时间戳与密钥管理。
  4. 工程加固:在 PX4/ArduPilot 上配置签名、密钥轮换与地面站白名单。
  5. 验证与复盘:通过日志、抓包与红蓝对抗验证防护有效性。

下图展示了本课程从“链路暴露面”到“安全加固点”的整体关系,帮助你在动手前建立全局视角。

MAVLink 链路暴露面与安全加固路径 地面站 GCS QGC / Mission Planner 指令下发 · 航点上传 无线遥测链路(暴露面) 433/915MHz · Wi-Fi · 4G/5G · 明文 MAVLink 帧 窃听 · 注入 · 重放 · 中间人 飞控 FCU PX4 / ArduPilot 执行 · 状态回传 攻击者 / SDR 捕获 · 伪造 · 重放 安全加固层(本课程核心) MAVLink 2 签名 HMAC-SHA256 密钥管理 分发 · 轮换 · 吊销 时间戳防重放 单调递增窗口 策略白名单 指令级控制

四、工程实践环境搭建

本课程所有实验均可在单机或小型局域网内完成,推荐环境如下:

组件 推荐选型 用途
飞控仿真 PX4 SITL + Gazebo 无硬件复现 MAVLink 链路
地面站 QGroundControl 发送指令、观察遥测
协议工具 pymavlink / MAVProxy 脚本化注入与解析
抓包分析 Wireshark + mavlink 插件 观察帧结构与签名字段
无线实验 HackRF / RTL-SDR 捕获与重放遥测信号

环境初始化可参考以下命令,先启动 SITL,再连接地面站与脚本:

# 启动 PX4 SITL(默认 UDP 14550 输出 MAVLink)
make px4_sitl gazebo

# 使用 MAVProxy 连接并查看心跳
mavproxy.py --master=udp:127.0.0.1:14550 --console

# 使用 pymavlink 读取心跳消息
python3 -c "
from pymavlink import mavutil
m = mavutil.mavlink_connection('udp:127.0.0.1:14550')
m.wait_heartbeat()
print('heartbeat from system', m.target_system)
"

建议为每个实验建立独立目录,保存抓包文件、脚本与日志。后续章节的签名密钥、时间戳窗口和攻击脚本都会在此基础上迭代。

五、常见误区与复盘

初学者常陷入三个误区:其一,认为“用了数传电台就安全”,实际上电台只解决物理层传输,不解决身份与完整性;其二,认为“开启 MAVLink 2 签名就万事大吉”,但若密钥硬编码在固件或地面站配置中,攻击者仍可通过逆向获取;其三,只关注空中链路,忽略地面站主机被恶意软件控制后,攻击者可以合法身份发送指令。复盘时应始终追问:谁在发送、发送了什么、能否被篡改、能否被重放、密钥如何保护。这五个问题将贯穿后续所有章节的攻防实验与加固设计。