CVE-2026-72810: SiYuan: WebSocket leak bypasses publish access control
GHSA-mw8r-mw84-88v2HIGHPoC AVAILABLECISA: TRACK*SiYuan's publish-mode WebSocket channel (port 6808) admits anonymous "reader" sessions into the same broadcast pool as authenticated clients, so any anonymous socket held open receives a real-time, unfiltered stream of every document edit — titles, block content, notebook names, and structure — including for password-protected and unpublished notes, because the kernel's broadcast functions never apply the publish-access checks that gate the equivalent HTTP endpoints. With 2,997 downstream dependents and a CVSS of 8.6 (confidentiality-only, no privileges or user interaction required), this is a trivial-to-exploit disclosure for any SiYuan instance running publish mode with auth disabled or permissively configured; EPSS sits at just 0.31% (76th percentile) and it's not in CISA KEV or paired with a public exploit or Nuclei template, so mass exploitation isn't underway, but the PoC is a one-line WebSocket connect held open during ordinary admin activity. Patch to the fixed kernel build (commit ba948639d7f6, per GHSA-mw8r-mw84-88v2) immediately on any internet-facing publish instance; until patched, keep `Publish.Auth.Enable=true` or restrict port 6808 at the network layer, and monitor for anomalous long-lived `/ws` connections from unauthenticated clients.
What is the risk?
High-severity (CVSS 8.6), trivially exploitable (no auth, no user interaction, single WebSocket connect) confidentiality breach. Likelihood of opportunistic exploitation is currently moderate-low per EPSS (0.31%, 76th percentile) and absence from CISA KEV, but the barrier to exploitation is near zero once an attacker knows a target runs SiYuan in publish mode with anonymous access — no tooling or AI/ML expertise required, just a persistent socket. The real exposure driver is deployment posture: any self-hosted publish instance exposed to the internet with `Publish.Auth.Enable=false` (a documented, supported configuration) is exploitable by design flaw, not misconfiguration alone, since the WebSocket route bypasses publish-access filters entirely regardless of settings intent.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Jupyter Notebook | go | < 0.0.0-20260723013612-ba948639d7f6 | 0.0.0-20260723013612-ba948639d7f6 |
Do you use Jupyter Notebook? You're affected.
How severe is it?
What is the attack surface?
What should I do?
1 step1) Upgrade SiYuan kernel to the version incorporating commit ba948639d7f6 (fix for GHSA-mw8r-mw84-88v2) immediately. 2) Until patched, do not run publish mode with
Publish.Auth.Enable=false; require Basic Auth or a strong publish password on any publish-enabled instance. 3) Restrict network access to port 6808 (and the/wsroute) to trusted IPs or a VPN/reverse-proxy allowlist — do not expose it directly to the internet. 4) Audit existing deployments for long-lived anonymous WebSocket connections in reverse-proxy/access logs, since the leak leaves no HTTP-layer trace. 5) Treat any content edited while a publish instance was internet-facing and unpatched as potentially disclosed, including password-protected and encrypted-notebook documents edited while unlocked. 6) Rotate any credentials or secrets that may have been pasted into SiYuan documents during the exposure window.
What does CISA's SSVC say?
Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-72810?
SiYuan's publish-mode WebSocket channel (port 6808) admits anonymous "reader" sessions into the same broadcast pool as authenticated clients, so any anonymous socket held open receives a real-time, unfiltered stream of every document edit — titles, block content, notebook names, and structure — including for password-protected and unpublished notes, because the kernel's broadcast functions never apply the publish-access checks that gate the equivalent HTTP endpoints. With 2,997 downstream dependents and a CVSS of 8.6 (confidentiality-only, no privileges or user interaction required), this is a trivial-to-exploit disclosure for any SiYuan instance running publish mode with auth disabled or permissively configured; EPSS sits at just 0.31% (76th percentile) and it's not in CISA KEV or paired with a public exploit or Nuclei template, so mass exploitation isn't underway, but the PoC is a one-line WebSocket connect held open during ordinary admin activity. Patch to the fixed kernel build (commit ba948639d7f6, per GHSA-mw8r-mw84-88v2) immediately on any internet-facing publish instance; until patched, keep `Publish.Auth.Enable=true` or restrict port 6808 at the network layer, and monitor for anomalous long-lived `/ws` connections from unauthenticated clients.
Is CVE-2026-72810 actively exploited?
Proof-of-concept exploit code is publicly available for CVE-2026-72810, increasing the risk of exploitation.
How to fix CVE-2026-72810?
1) Upgrade SiYuan kernel to the version incorporating commit ba948639d7f6 (fix for GHSA-mw8r-mw84-88v2) immediately. 2) Until patched, do not run publish mode with `Publish.Auth.Enable=false`; require Basic Auth or a strong publish password on any publish-enabled instance. 3) Restrict network access to port 6808 (and the `/ws` route) to trusted IPs or a VPN/reverse-proxy allowlist — do not expose it directly to the internet. 4) Audit existing deployments for long-lived anonymous WebSocket connections in reverse-proxy/access logs, since the leak leaves no HTTP-layer trace. 5) Treat any content edited while a publish instance was internet-facing and unpatched as potentially disclosed, including password-protected and encrypted-notebook documents edited while unlocked. 6) Rotate any credentials or secrets that may have been pasted into SiYuan documents during the exposure window.
What systems are affected by CVE-2026-72810?
This vulnerability affects the following AI/ML architecture patterns: Self-hosted knowledge-base / PKM platforms, AI agent workspaces backed by note/document repositories, RAG pipelines sourcing content from SiYuan document stores.
What is the CVSS score for CVE-2026-72810?
CVE-2026-72810 has a CVSS v3.1 base score of 8.6 (HIGH). The EPSS exploitation probability is 0.54%.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0036Data from Information RepositoriesCompliance Controls Affected
What are the technical details?
Original Advisory
**CVE:** This vulnerability corresponds to [CVE-2026-72810](https://nvd.nist.gov/vuln/detail/CVE-2026-72810). ### Summary WebSocket sessions established through the publish surface (port 6808, `RoleReader` anonymous when `Publish.Auth.Enable` is `false`) are added to the same broadcast session pool as authenticated sessions. The kernel's broadcast functions push content events transactions carrying block DOM, document save/create, move/rename to every session in the pool with no role or publish-access filtering. As a result, an anonymous reader who holds a WebSocket connection open passively receives a real-time feed of every edit made in the workspace, including edits to password-protected, publish-forbidden, and unpublished documents. Because these events are delivered over the push channel and never pass through an HTTP handler, none of the publish-access filters that gate the HTTP endpoints apply. ### Details **Session admission.** `HandleConnect` admits the injected `RoleReader` publish token, and the session is registered via `AddPushChan` into the same `sessions` pool used for authenticated clients. **Unfiltered broadcast.** The broadcast functions (`Broadcast`, `broadcastOthers`, `broadcastOtherAppMains`, …) write to every session in the pool with no role or publish-access check. The `isPublish` flag on a session is consulted only to send the "service closed" notice it is never used to gate content. Content events are pushed via `PushModeBroadcast → Broadcast()`, so transactions (with rendered block DOM), `savedoc`/create, and `moveDoc`/rename events reach the publish reader's socket unfiltered. **No HTTP filter applies.** This is a push channel, the events originate from the kernel's own edit pipeline and are broadcast directly to open sockets. They never traverse an HTTP handler, so the publish-access filters that gate the HTTP content endpoints (and the incomplete/missing filters reported separately on those endpoints) are not in the path at all. The WebSocket route (`/ws`) is `CheckAuth`-only, which the publish `RoleReader` token satisfies. ### Proof of Concept Reproduced on a local instance (SiYuan running locally, publish mode enabled on port 6808, publish Basic Auth disabled). An anonymous client (no token, no password) opens `wss://127.0.0.1:6808/ws` and holds it open while an administrator edits documents in the workspace. The anonymous socket received, in real time and unfiltered: - `updateAttrs` with `name=WS_LEAK_SECRET_9931` on a block whose `rootID` is a **password-protected** document. - The secret title `WS_SECRET_DOC_7742` of a newly created document. - The create event carrying the notebook (box) name `CritChain` and the document path. No HTTP request was made beyond the WebSocket upgrade; the content arrived over the push channel. ### Impact An anonymous reader (publish mode with auth disabled) or any publish `RoleReader` who merely holds a WebSocket connection open receives a live feed of every edit an administrator makes: block DOM, attributes, titles, notebook names, and document structure, including for password-protected, publish-forbidden, and unpublished documents. This defeats the publish-access and publish-password boundaries entirely for any content edited while the socket is open. The precondition is trivial: an administrator active in the workspace while the anonymous socket is connected. Confidentiality-only (passive disclosure); the channel is receive-only for the reader. Encrypted-notebook content follows the same broadcast path if edited while unlocked. ### Suggested fix Filter broadcasts by session before writing: for any session flagged `isPublish`, apply the same publish-access/publish-ignore/publish-password checks used on the HTTP content path before pushing a content event, or exclude publish sessions from content broadcasts entirely and deliver only the events a publish viewer is authorized to see. The `isPublish` flag is already present on the session; it should gate content, not only the service-closed notice.
Exploitation Scenario
An attacker discovers a SiYuan publish instance exposed on port 6808 with `Publish.Auth.Enable=false` (default-permissive or a common misconfiguration for "quick sharing"). They open a WebSocket connection to `wss://target:6808/ws` with no credentials — `HandleConnect` admits them as an anonymous `RoleReader` and registers the session into the shared broadcast pool. The attacker holds the connection open indefinitely and passively logs every pushed event. As an administrator works in the workspace over the following hours or days — editing password-protected compliance documents, creating a new document with sensitive credentials in the title, renaming notebooks — the attacker's socket silently receives the full block DOM, titles, and document-structure events for all of it, with zero indication in HTTP logs that anything was accessed. The attacker reconstructs sensitive content entirely from the push stream without ever making an authorized HTTP request.
Weaknesses (CWE)
CWE-862 — Missing Authorization: The product does not perform an authorization check when an actor attempts to access a resource or perform an action.
- [Architecture and Design] Divide the product into anonymous, normal, privileged, and administrative areas. Reduce the attack surface by carefully mapping roles with data and functionality. Use role-based access control (RBAC) [REF-229] to enforce the roles at the appropriate boundaries. Note that this approach may not protect against horizontal authorization, i.e., it will not protect a user from attacking others with the same role.
- [Architecture and Design] Ensure that access control checks are performed related to the business logic. These checks may be different than the access control checks that are applied to more generic resources such as files, connections, processes, memory, and database records. For example, a database may restrict access for medical records to a specific database user, but each record might only be intended to be accessible to the patient and the patient's doctor [REF-7].
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:NReferences
Timeline
Related Vulnerabilities
CVE-2026-7281110.0SiYuan: SQL injection enables cross-notebook DB access
Same package: notebookCVE-2026-6908510.0SiYuan: SQL injection in searchDocs allows DB tampering
Same package: notebookCVE-2026-6908410.0SiYuan: SQL injection in search endpoint exposes notebooks
Same package: notebookCVE-2026-6908310.0SiYuan: unauthenticated SQLi in full-text search endpoint
Same package: notebookCVE-2026-11105710.0Mercury: regex blocklist bypass allows unauthenticated RCE
Same package: notebook