CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-23850

SiYuan Note LFD: Turning Personal Knowledge into Public Property

Amit Schendel
Amit Schendel
Senior Security Researcher

Jan 21, 2026·5 min read·53 visits

Executive Summary (TL;DR)

SiYuan < 3.5.4 has a feature that downloads remote images referenced in Markdown to the local server for offline storage. It fails to validate the URI scheme, allowing attackers to supply `file://` paths or internal IPs. This tricks the server into reading `/etc/passwd` or internal metadata and saving it as a static asset, which the attacker can then download.

A critical Local File Disclosure (LFD) and Server-Side Request Forgery (SSRF) vulnerability in SiYuan note-taking software allows authenticated attackers to read sensitive files from the host server by abusing the 'local assets' conversion feature.

The Hook: Privacy-First, Security-Maybe

SiYuan markets itself as a "privacy-first" personal knowledge management system. It's the kind of tool where you store your deepest thoughts, your startup ideas, and maybe your API keys. It runs locally or on a private server, promising that your data belongs to you.

But as any security researcher knows, the more a product screams "privacy," the more ironic its inevitable security failure will be. CVE-2026-23850 is a textbook example of a convenience feature tearing a hole through that privacy promise. It turns the application into a glorified file server for anyone with a login.

This isn't a complex buffer overflow or a race condition. It is a logic flaw born from the desire to make the user experience smoother. The developers wanted to let you save external images locally. They just forgot to check if those "images" were actually system files like /etc/passwd.

The Flaw: The 'Download Everything' Handler

The vulnerability lives in a feature called netAssets2LocalAssets. The logic is simple: you write a Markdown document with a link to an image (e.g., ![cat](http://cat.com/meow.jpg)), and the server fetches that image and saves it to your local workspace so you don't lose it if the internet goes down.

The problem? The function netAssets2LocalAssets0 in kernel/model/assets.go trusted the input implicitly. It parses the Markdown, extracts the link, and hands it off to a resource fetcher.

It failed to ask two critical questions:

  1. What protocol are we using? (It accepted file:// just as happily as http://).
  2. Where does this point? (It didn't validate if the target was localhost, a private IP, or a sensitive system path).

If you passed it file:///etc/shadow, the server reasoned: "Ah, the user wants to save a local copy of this file. I shall read it and place it in the public assets folder for them."

The Code: The Smoking Gun

Let's look at the logic flow. The vulnerable code effectively treated any string inside []() or ![]() as a target for retrieval.

Here is a conceptual simplification of what was happening server-side:

// Pseudo-code of the vulnerable logic
func netAssets2LocalAssets(link string) {
    // No check for 'file://' prefix!
    data, err := readFileOrNetwork(link)
    if err == nil {
        // Saves content to /data/assets/network-asset-xxx
        saveToPublicDir(data)
    }
}

The fix, introduced in version 3.5.4, didn't actually disable the file:// protocol or implement a robust whitelist. Instead, it introduced a utility function IsSensitivePath in kernel/util/path.go.

This function acts as a massive blocklist (a "deny list"). It explicitly checks if the path contains strings like:

  • /etc/passwd, /etc/shadow
  • .ssh, id_rsa
  • .env, config.yaml

> [!ALERT] > Researcher Note: Blacklists are notoriously difficult to maintain. While this stops the script kiddie copying a /etc/passwd PoC, it leaves the door open for creative attackers to find files that aren't on the list, or to use the SSRF vector to hit internal metadata endpoints (like AWS 169.254.169.254), which are rarely file paths.

The Exploit: Stealing Secrets in 5 Steps

Exploiting this requires an authenticated session, but in many self-hosted instances, users share credentials or use weak auth codes. Here is how we turn a note-taking app into a data exfiltration tool.

  1. Login: Authenticate to the API.
  2. Plant the Bait: Create a new Markdown note via /api/filetree/createDocWithMd.
    {
      "markdown": "[loot](file:///etc/passwd)"
    }
  3. Trigger the Trap: Call the asset conversion endpoint /api/format/netAssets2LocalAssets on the document ID you just created.
  4. The Server Obeys: The server reads /etc/passwd, thinks it's downloading an asset, and saves it to /data/assets/ with a name like network-asset-passwd-xyz.txt.
  5. Exfiltrate: List the directory contents via /api/file/readDir to find the generated filename, then download it directly via the web interface.

The Impact: Why You Should Care

The impact here is twofold: Local File Disclosure (LFD) and Server-Side Request Forgery (SSRF).

LFD: Attackers can grab configuration files. If SiYuan is running in a Docker container, you might just get container configs. But if it's running on bare metal (common for personal servers), you could grab SSH keys (~/.ssh/id_rsa), the app's own database credentials, or environment variables containing API keys for third-party integrations.

SSRF: Since the validator doesn't block IP addresses, an attacker could force the server to scan the internal network.

  • [router](http://192.168.1.1/admin) -> Saves the router login page.
  • [cloud](http://169.254.169.254/latest/meta-data/) -> If hosted on AWS/GCP, this could leak the instance IAM role credentials, leading to full cloud account compromise.

The Fix: Imperfect but Essential

The vendor patched this in version 3.5.4. The patch (Commits b2274bab and f8f4b517) implements the IsSensitivePath check.

Critique: The fix is a "band-aid." It patches the symptom (reading sensitive files) by blocking specific filenames, rather than addressing the root cause (unrestricted protocol usage). A more robust fix would have been to:

  1. Whitelist protocols: Only allow http and https.
  2. Disable local interaction: Explicitly ban file://.
  3. Implement an egress filter: Block calls to private IP ranges (RFC 1918) to prevent SSRF.

For now, the blocklist stops the obvious attacks, but savvy researchers will likely be fuzzing that IsSensitivePath function looking for bypasses involving symbolic links, alternative encodings, or unlisted sensitive files.

Official Patches

SiYuanOfficial Release Notes for v3.5.4

Fix Analysis (2)

Technical Appendix

CVSS Score
7.8/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
EPSS Probability
0.06%
Top 83% most exploited

Affected Systems

SiYuan Note < 3.5.4 (Windows)SiYuan Note < 3.5.4 (macOS)SiYuan Note < 3.5.4 (Linux / Docker)

Affected Versions Detail

Product
Affected Versions
Fixed Version
SiYuan
SiYuan
< 3.5.43.5.4
AttributeDetail
CWE IDCWE-22
Attack VectorNetwork
CVSS v4.07.8 (High)
CVSS v3.18.8 (High)
ImpactConfidentiality Loss (High)
Exploit StatusPoC Available

MITRE ATT&CK Mapping

T1559Inter-Process Communication
Execution
T1005Data from Local System
Collection
T1210Exploitation of Remote Services
Lateral Movement
CWE-22
Path Traversal

Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')

Known Exploits & Detection

GitHub IssueOriginal issue report detailing the vulnerability
Generated PoCPython script demonstrating authenticated LFD

Vulnerability Timeline

Patch commits pushed to repository
2026-01-18
CVE-2026-23850 assigned
2026-01-19
GHSA-cv54-7wv7-qxcw published
2026-01-21

References & Sources

  • [1]GHSA-cv54-7wv7-qxcw
  • [2]NVD - CVE-2026-23850

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 16 hours ago•CVE-2026-115895
8.8

CVE-2026-115895: Code Injection via Unsanitized Import Alias in Happy DOM ECMAScript Module Compiler

CVE-2026-115895 is a high-severity code injection vulnerability (CWE-94) in the happy-dom npm package prior to version 21.0.4. The vulnerability exists within the ECMAScriptModuleCompiler component, which transforms ECMAScript module syntax into executable Node.js functions when JavaScript evaluation is enabled. Due to an incomplete fix for CVE-2026-33943, the compiler failed to validate local named import aliases against legal JavaScript identifier rules. Attackers supplying crafted module imports—specifically utilizing destructuring default initializers alongside JSON module attributes—can inject arbitrary JavaScript expressions directly into the host Node.js runtime context.

Amit Schendel
Amit Schendel
7 views•10 min read
•about 17 hours ago•CVE-2026-115883
6.0

CVE-2026-115883: Cross-Namespace Access via Dot-Delimited Labels in LangGraph Postgres and SQLite Stores

An improper input validation and authorization bypass vulnerability exists in the LangGraph storage layer affecting langgraph, langgraph-checkpoint-postgres, and langgraph-checkpoint-sqlite. Because relational store implementations serialize namespace tuples into dot-delimited strings without validating labels on read, search, delete, and batch operations, an attacker who controls a namespace label can inject periods (.) to traverse namespace boundaries and access, modify, or delete data belonging to other namespaces.

Amit Schendel
Amit Schendel
8 views•9 min read
•about 18 hours ago•CVE-2026-115886
6.5

CVE-2026-115886: Unauthenticated Server-Side Request Forgery and Unsafe Reflection in MLflow Scorer Evaluation Endpoints

CVE-2026-115886 (GHSA-2wqp-q3c6-ccj5) is a Server-Side Request Forgery (SSRF) and Unsafe Reflection vulnerability in MLflow versions 3.12.0rc0 prior to 3.17.0. Unauthenticated REST API endpoints accept serialized third-party scorer JSON payloads that are dynamically deserialized and reflectively instantiated without sanitizing constructor keyword arguments. When optional dependencies such as trulens and trulens-providers-litellm are installed, attackers can inject egress-steering arguments into the scorer payload, forcing the MLflow server to dispatch outbound HTTP requests to arbitrary internal destinations or cloud metadata services.

Alon Barad
Alon Barad
9 views•10 min read
•about 19 hours ago•CVE-2026-113872
7.5

CVE-2026-113872: Unauthenticated Process Crash in Express Multer via Late Busboy Stream Resumption

CVE-2026-113872 (GHSA-q7qp-rjg7-q26m) is a high-severity denial-of-service vulnerability affecting the multer multipart/form-data upload middleware for Node.js and Express in versions 2.0.0 through 2.4.0. When an endpoint is configured to accept multiple files using an asynchronous fileFilter callback, a crafted, truncated multipart HTTP request can trigger an unhandled error event on the underlying busboy stream parser after request teardown has already completed. Because all error listeners are stripped during teardown, Node.js treats the resulting error event as an uncaught exception and immediately terminates the server process.

Amit Schendel
Amit Schendel
7 views•12 min read
•about 20 hours ago•CVE-2026-115897
2.1

CVE-2026-115897: Cross-Site Scripting via Function Body Boundary Bypass in serialize-javascript

CVE-2026-115897 (also tracked as GHSA-m5mm-p8h7-m29v and aliased as CVE-2026-115754) is a Cross-Site Scripting (XSS) vulnerability in the Yahoo serialize-javascript npm package prior to version 7.1.3. The flaw exists in the regular expression used by escapeFunctionBody() to neutralize HTML script closing tags within serialized JavaScript functions. Because function bodies are sanitized in isolation before structural formatting is applied, a function whose string representation terminates directly with the sequence '</script' bypasses the positive lookahead check. When combined with serialization formatting options that introduce whitespace delimiters and a subsequent property that supplies a closing bracket, an attacker can prematurely terminate an enclosing HTML <script> block and inject arbitrary HTML or JavaScript into the rendered document.

Amit Schendel
Amit Schendel
7 views•13 min read
•about 21 hours ago•CVE-2026-109841
5.9

CVE-2026-109841: Subresource Integrity Verification Bypass in Node.js Undici

CVE-2026-109841 is a Subresource Integrity (SRI) verification bypass vulnerability in undici, the official HTTP/1.1 and HTTP/2 client library for Node.js that powers the global fetch() implementation. The flaw stems from improper handling of case sensitivity (CWE-178) when validating cryptographic hash algorithm tokens within SRI metadata. Because undici compared incoming algorithm identifiers against a strictly lowercase set without prior ASCII-lowercase normalization, valid uppercase or mixed-case tokens such as SHA256- or Sha384- were treated as unrecognized algorithms and discarded. Under SRI forward-compatibility rules, discarding all provided tokens results in an empty integrity list, causing undici to fail open and accept tampered HTTP response bodies without cryptographic verification.

Alon Barad
Alon Barad
10 views•9 min read