CVE-2025-67268gpsd 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数据,使其成为攻击目标。