无人机到地面控制站的攻击向量、漏洞与利用
如今的无人机机群通常是由一名操作员从单一地面站操控数十或数百架无人机。这使得地面控制站成为对手的宝贵目标。飞行员通常位于此处,这里往往存储任务数据,并且是横向移动至 UxS 网络及机群中其他无人机的首要途径。
大多数无人机安全研究都聚焦于攻击无人机本身。受感染的无人机研究采取了另一种方法,重点揭示单架被攻陷的无人机如何攻击与其连接的地面站。由于大多数地面控制软件信任无人机发送的任何内容,缺乏身份验证、校验和清理,使得来自被攻陷无人机的数据可能导致操作员机器上的文件增删改查、代码执行或崩溃。
本仓库记录了地面控制站软件中的漏洞,并附带了可用的概念验证代码。发布此内容仅用于教育目的,供操作员了解自身暴露风险,并让维护者能够复现和修复这些问题。
仅对您拥有或已获得书面许可测试的系统运行这些 PoC。每一个 PoC 都是为测试台编写的:有效载荷是良性标记,且此处没有任何内容被打包用于针对他人的飞行器或地面站。在您无法控制的系统上使用此材料,在您所在的任何地方都可能违法。
每个发现的“复现”部分说明了其所需条件和功能。在运行任何内容之前请先阅读。
图例:
投递类别是攻击者必须在链路上执行的操作,它决定了哪些向量有效。 推送类发现仅需一个帧到达 GCS,因此任何具备注入能力的向量都足够。 握手和请求/响应类发现需要攻击者成为或完全控制对话对端,这更有利于总线上的外设、被攻陷的伴飞计算机、供应链或完整的中间人攻击。
修复列链接了已提交的上游拉取请求。十五个发现中有十个附带了针对供应商自身仓库提交的补丁。
| ID | 产品 | 严重性 | CWE | 汇聚点类别 | 投递类别 | 受感染飞控 / 供应链? | 恶意总线外设? | 被攻陷的伴飞计算机? | WiFi/UDP 注入? | TCP/云中间人? | SiKW00F 注入? | SiK 完整中间人? | 修复 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| QGC-01 | QGroundControl | 🟠 高 | 22/73/170 | CAMERA_INFORMATION → 路径遍历写入(连接时零点击写入) | 推送(CAMERA_INFORMATION)+ 通过 cam_definition_uri 提供内容 | ✅ | ✅ 最自然(摄像头) | ✅ | ✅ | ✅ | ✅ 触发为推送;名称字段内联 | ✅ | PR #15083 |
| QGC-02 | QGroundControl | 🔴 严重 | 22/73/494/918 | COMPONENT_METADATA uri → 任意文件写入 → 连接时零点击 RCE | 请求/响应(通过 IP 获取 URI) | ✅ | ✅ 发出元数据 uri | ✅ | ✅ 用于触发 | ✅ | ⚠️ 推送触发可以;获取通过 IP | ✅ | PR #15084 |
| QGC-03 | QGroundControl | 🟠 高 | 22/770 | FTP 列表 → 遍历写入 + 偏移磁盘填充 | 握手(MAVFTP 列表/下载) | ✅ | ✅ 对端响应 FTP | ✅ | ⚠️ 注入可以,自行握手较难 | ✅ | ⚠️ 会话/序列存在竞争 | ✅ 桥接提供列表 | PR #15085 |
| QGC-04 | QGroundControl | 🟡 中 | 191/125 | DataFlash .bin 解析器越界读取 + 下溢 | 握手(下载恶意 .bin 日志) | ✅ | ✅ 对端提供 DataFlash | ✅ | ⚠️ | ✅ | ⚠️ 必须提供日志块 | ✅ 桥接馈送 .bin | PR #15086 |
| MP-01 | Mission Planner | 🟠 高 | 22→94 | MAVFTP 遍历 → 插件加载器 RCE | 握手(MAVFTP 请求/确认 → RCE) | ✅ | ✅ 对端响应列表 | ✅ 完全链路控制 | ⚠️ 注入容易,但需掌控握手 | ✅ 在中继处重写 | ⚠️ 必须赢得竞争 + 匹配会话/序列 | ✅ 桥接掌控 FTP 对话 | PR #3774 |
| MP-02 | Mission Planner | 🟠 高 | 94/78 | gst:// → gst_parse_launch(文件读写 + 外泄) | 推送(VIDEO_STREAM_INFORMATION → gst) | ✅ | ✅ 摄像头宣告 uri | ✅ | ✅ UDP 数据报 | ✅ | ✅ 一次性流帧 | ✅ 轻而易举 | PR #3775 |
| MP-03 | Mission Planner | 🟠 高 | 74/601 | STATUSTEXT 标记 → Process.Start | 推送(STATUSTEXT → ShellExecute) | ✅ | ✅ 任何组件发出 | ✅ | ✅ | ✅ | ✅ 即发即忘文本 | ✅ | PR #3776 |
| MP-04 | Mission Planner | 🟡 中 | 248/20/1050 | RALLY_TOTAL/FENCE_TOTAL → 未校验的 int.Parse + UI 线程上的 O(n²)(连接时零点击) | 推送(PARAM_VALUE,连接后自动) | ✅ | ✅ 发出 PARAM_VALUE | ✅ | ✅ | ✅ | ⚠️ 必须将参数落入 MP 的字典 | ✅ | PR #3777 |
| MAVSDK-01 | MAVSDK | 🟡 中 | 918/749 | 组件元数据 curl SSRF + file://(无协议允许列表) | 请求/响应(通过 IP 获取 COMPONENT_METADATA.uri) | ✅ | ✅ 发出元数据 uri | ✅ | ✅ 用于触发 | ✅ | ⚠️ 推送触发可以;通过 IP 获取 | ✅ | 无 |
| MAVSDK-02 | MAVSDK | 🟠 高 | 22/73/918 | 摄像头定义 SSRF + mftp:// 遍历 → 零点击破坏沙箱外的文件 | 推送(CAMERA_INFORMATION.cam_definition_uri,自动) | ✅ | ✅ 最自然(摄像头) | ✅ | ✅ | ✅ | ✅ 自动消费的推送 | ✅ | PR #3073 |
| MAVSDK-03 | MAVSDK | 🟠 高 | 409/400/770/459 | .xz 摄像头定义或 COMPONENT_METADATA → 无限制解压 → 持久性磁盘耗尽 | 推送(CAMERA_INFORMATION.cam_definition_uri,自动)—— 一个裸 HEARTBEAT 即可启动 | ✅ | ✅ 最自然(摄像头) | ✅ | ✅ | ✅ | ✅ 自动消费的推送;每 2 GiB 约 50 秒的 57.6 kbps 空口时间 | ✅ | PR #3074 |
| MAVPROXY-01 | MAVProxy | 🟠 高 | 502 | asterix 通过 UDP 的 pickle.loads → RCE | IP 侧信道(UDP,非 MAVLink 射频链路) | ❌ 不在 MAVLink 链路上 | ❌ 独立的 UDP 套接字 | ⚠️ 仅当能访问 :45454 | ✅ UDP 到主机:45454 | ❌ 自有 UDP 套接字,非中继 | ❌ 不在射频/MAVLink 链路上 | ❌ 不在射频/MAVLink 链路上 | 上游已由 #1728 修复,未发布 |
| MAVROS-01 | mavros | 🟡 中 | 345/770 | PARAM_VALUE → 伪造全局 /parameter_events + 无上限映射 | 推送/流(注入 PARAM_VALUE,无需握手) | ✅ | ✅ 发出 PARAM_VALUE | ✅ | ✅ UDP 洪泛 | ✅ | ✅ 洪泛 PARAM_VALUE | ✅ | 无 |
| MAVROS-02 | mavros | 🟠 高 | 125/617/248 | FTP 写入确认 → 无限制 std::advance → 堆泄露 + 进程中止 | 握手(毒化 FTP 回复 → 崩溃) | ✅ | ✅ 对端发送错误 FTP | ✅ | ⚠️ | ✅ | ⚠️ 必须落入畸形回复 | ✅ 桥接注入错误回复 | 无 |
| DRONEKIT-01 | DroneKit | ⚪ 信息 | 20 | 信任边界交接(param_id / STATUSTEXT) | 推送(遥测 → 应用回调;设计上的交接) | ✅ | ✅ 任何组件 | ✅ | ✅ | ✅ | ✅ 任何推送帧到达回调 | ✅ | 不适用 |
矩阵为每个发现评分七列:以下五个向量,加上两种 SiK 无线电(射频遥测)模式,鉴于注入与中间人的细微差别,后者在下方单独说明。
受感染的飞控、串行连接或供应链。 本地攻击者或恶意飞控被物理连接到 GCS 主机或无线电。飞行器或固件是操作员未构建的:演示单元、租赁、被扣押的机体或二手飞行器,其固件被植入以在 GCS 连接时立即发出恶意 MAVLink。操作员自己的 GCS 是受害者;“飞行器”在通电之前就已是敌对的。适用于每个发现,并且是投递连接时握手漏洞利用最干净的方式。这延伸到可能直接连接或从受感染飞行器提取数据的取证分析师。这些工件如果处理不当,可能会感染或传播到分析师的计算机和网络。
飞行器自身总线上的恶意/伪造 MAVLink 外设。 第三方摄像头、云台、ADSB-in、测距仪或任何使用 MAVLink 通信且自身即为攻击者的设备。它是链路上的合法参与者,发出恶意帧。一个伪造的“智能摄像头”宣告被投毒的消息,其行为与真实摄像头完全相同,只是携带了恶意值。
机载被攻陷的伴飞计算机(运行 mavlink-router / MAVProxy 的 Raspberry Pi / Jetson)。一旦被攻陷,它成为飞行器端点,拥有对链路的完全双向访问权限及其实时状态的可见性。它可以响应任何握手并发出任何推送帧,这使其对本集合中的每个发现都可行。
WiFi / UDP 遥测桥(ESP8266 / ESP32“wifi 遥测”)。接入点或局域网上的任何人都可以注入 MAVLink 数据。这将注入向量的成本降至接近零,并且对于还能拦截(ARP/AP 中间人)的攻击者,也能实现完全握手控制。
TCP / 云中继(SITL、mavlink-router TCP、mavp2p、4G/LTE 云 GCS,如商业无人机云服务)。在中继处进行中间人攻击,或任何能访问暴露的 TCP 端口的人,都可以重写数据流。云/4G 链路极大地扩大了地理影响范围,并且通常缺乏双向认证。
ArduPilot/PX4 爱好者和专业消费级飞行器的主要真实射频遥测路径是 SiK 无线电对,这是一种透明的串行桥接,不解析或校验 MAVLink,因此对 GCS 不提供任何针对恶意内容的保护。一个流氓 SiK 模块使用 sikw00f 加入或桥接现有链路。两种攻击模式,可靠性差异很大:
STATUSTEXT、PARAM_VALUE、CAMERA_INFORMATION 等)可靠,无需回复。对于握手协议(MAVFTP、参数/日志下载)不可靠,因为注入器必须赢得空口竞争并匹配其无法控制的会话/序列。注意:SiK 加密(AES-128,在支持的情况下)默认关闭,并使用静态共享密钥。