IPBUF安全漏洞报告
English
CVE-2026-37537 CVSS 8.1 高危

CVE-2026-37537 Open-SAE-J1939 整数下溢漏洞

披露日期: 2026-05-01

漏洞信息

漏洞编号
CVE-2026-37537
漏洞类型
越界写入
CVSS评分
8.1 高危
攻击向量
邻接 (AV:A)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
collin80/Open-SAE-J1939

相关标签

越界写入整数下溢Open-SAE-J1939缓冲区溢出CVE-2026-37537CAN总线

漏洞概述

collin80/Open-SAE-J1939 项目在传输协议数据传输处理中存在严重漏洞。该漏洞源于整数下溢,发生在 `uint8_t index = data[0] - 1` 处。当CAN帧序列号 `data[0]` 为0时,索引下溢为255。后续写入时计算出的偏移量1791超出了 `MAX_TP_DT` 缓冲区(1785字节)限制,导致6字节越界写入。攻击者可通过邻接网络利用此漏洞,无需认证即可破坏系统完整性和可用性。

技术细节

该漏洞位于 `collin80/Open-SAE-J1939` 仓库的传输协议数据传输(Transport Protocol Data Transfer)处理逻辑中。漏洞的根本原因是对无符号整型变量 `index` 的计算缺乏边界检查。代码 `uint8_t index = data[0] - 1` 假设 `data[0]`(序列号)至少为1。然而,当攻击者发送特制的CAN数据帧,并将序列号设置为0时,由于无符号整数下溢,`index` 的值变为255。在后续的数据写入操作中,代码利用该索引计算写入地址:`tp_dt->data[255*7 + i-1]`。由于索引异常,最终计算的偏移量为1791字节。而目标缓冲区 `MAX_TP_DT` 的大小仅为1785字节。这意味着写入操作超出了缓冲区末尾6个字节的位置。这种越界写入属于内存破坏漏洞,可能导致程序崩溃、数据损坏,或者在特定条件下执行任意代码。攻击向量为邻接网络(AV:A),意味着攻击者必须位于本地网络子网内才能发送恶意CAN帧。由于无需用户交互(UI:N)且无需认证(PR:N),该漏洞对车载网络或工业控制系统中的设备构成高危威胁。

攻击链分析

STEP 1
侦察
攻击者识别目标网络中运行 collin80/Open-SAE-J1939 库的设备,确认其版本存在漏洞。
STEP 2
构造载荷
攻击者编写或使用工具生成特定的CAN数据帧,将帧数据的第一个字节(序列号)设置为0。
STEP 3
投递攻击
攻击者通过物理接入或邻接网络接口,将恶意CAN帧发送到目标车辆或设备的总线上。
STEP 4
触发漏洞
目标设备的J1939协议栈接收并解析该帧。在处理传输协议时,执行 `data[0] - 1` 导致整数下溢,索引变为255。
STEP 5
内存破坏
程序使用错误的索引计算缓冲区偏移量,向 `MAX_TP_DT` 缓冲区之外写入6字节数据。
STEP 6
影响实现
导致系统崩溃(拒绝服务),或在特定架构下利用越界写入控制程序流,实现代码执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <stdint.h> #include <stdlib.h> #define MAX_TP_DT 1785 // Simulated structure based on the vulnerability description struct TP_DT { uint8_t data[MAX_TP_DT]; }; // Function simulating the vulnerable logic void vulnerable_transport_protocol_handling(uint8_t *can_frame_data) { struct TP_DT *tp_dt = (struct TP_DT *)malloc(sizeof(struct TP_DT)); if (!tp_dt) return; // VULNERABLE LINE: Integer underflow occurs here if data[0] is 0 // uint8_t index = data[0] - 1; uint8_t index = can_frame_data[0] - 1; printf("[DEBUG] Calculated index: %d\n", index); // Simulating the loop that writes data for (int i = 1; i < 8; i++) { // Calculate offset: index * 7 + i - 1 // If index is 255 (due to underflow), offset starts at 255*7 = 1785 int offset = index * 7 + i - 1; printf("[DEBUG] Attempting write to offset: %d\n", offset); if (offset >= MAX_TP_DT) { printf("[!!!] OUT-OF-BOUNDS WRITE DETECTED at offset %d (Buffer size: %d)!\n", offset, MAX_TP_DT); // In a real scenario, this corrupts memory } else { tp_dt->data[offset] = can_frame_data[i]; } } free(tp_dt); } int main() { // Malicious CAN frame payload // data[0] is the sequence number. Setting it to 0 triggers the underflow. uint8_t malicious_frame[8] = {0x00, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47}; printf("--- CVE-2026-37537 PoC Trigger ---\n"); printf("Sending frame with sequence number 0...\n"); vulnerable_transport_protocol_handling(malicious_frame); printf("--- Exploit Attempt Finished ---\n"); return 0; }

影响范围

collin80/Open-SAE-J1939 <= commit 744024d4306bc387857dfce439558336806acb06

防御指南

临时缓解措施
建议立即检查并更新 Open-SAE-J1939 库至包含补丁的最新提交。若无法立即升级,应在接入CAN总线的网关或边界设备上部署过滤规则,丢弃序列号为0的异常传输协议帧。此外,严格限制对车辆或工业控制系统CAN总线的物理访问和网络访问权限,防止未授权设备发送恶意数据包。

参考链接

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