Someone left the diary on the porch and removed the lock's anti-pick pins
CVE-2026-73056 affects SiYuan kernel versions before 3.7.4. The CheckAuth() middleware validates the API token (Conf.Api.Token) via Authorization header or ?token= query parameter, but neither path integrates with the built-in CAPTCHA or lockout mechanisms (NeedCaptcha / WrongAuthCount). An unauthenticated remote attacker can make unlimited guesses against the token, and if successful, gains RoleAdministrator access — enabling arbitrary file operations and SQL queries against the workspace database. A companion issue (CVE-2026-73046) affects the HTTP Basic Auth branch similarly.
The vendor's CVSS 9.8 CRITICAL rating assumes an internet-reachable instance with a weak, guessable token. That score dramatically overstates the risk for enterprise environments. SiYuan is a *personal* open-source note-taking and knowledge management app with ~45k GitHub stars — it is not enterprise infrastructure. The vast majority of its ~45,000 active installations run as local desktop apps bound to localhost, completely unreachable from the network. Only the self-hosted Docker/VPS subset is remotely exploitable, and even then, brute-forcing a sufficiently entropic token is computationally infeasible. For an enterprise fleet of 10,000 hosts, SiYuan presence is likely single-digit at best, installed ad-hoc by individual developers — not centrally managed, not on a critical path, and not holding regulated data.
4 steps from start to impact.
Identify internet-exposed SiYuan instance
/api/system/version endpoint. Only Docker/VPS self-hosted instances with open ports are reachable.- SiYuan instance must be network-accessible (not localhost-bound desktop mode)
- Port 6806 or reverse-proxy path must be reachable from the internet
- Default desktop installations bind to 127.0.0.1 — unreachable remotely
- Enterprise firewalls and NAT prevent casual exposure of developer tools
- No Shodan/Censys evidence of significant SiYuan exposure footprint
Brute-force the API token
Authorization: Token <guess> requests to any /api/* endpoint. The CheckAuth() middleware compares each guess to Conf.Api.Token without rate limiting, lockout, or CAPTCHA enforcement. The comparison also uses non-constant-time string comparison, theoretically leaking timing information, though this is secondary to the rate-limiting gap.- API token must be configured (if unset, there is no auth — a separate, worse problem)
- Token must be short or low-entropy enough to be practically guessable
- A user-chosen token of 20+ alphanumeric characters has ~119 bits of entropy — brute force is infeasible
- Even a 10-character alphanumeric token has ~59 bits — still impractical at network speeds
- The attack only works against short PINs or dictionary-strength passwords used as tokens
/api/*; web server access logs showing abnormal request volume to SiYuan endpointsObtain RoleAdministrator access
/api/file/*), SQL queries (/api/query/sql), and system configuration endpoints. The attacker can read, modify, or delete all workspace content.- Successful token guess from step 2
- Blast radius is limited to the SiYuan workspace — personal notes and documents
- No lateral movement capability to other hosts or enterprise systems
- No privilege escalation to the underlying OS unless chained with a separate RCE
Data exfiltration or workspace manipulation
- Admin API access from step 3
- Personal note-taking data rarely contains credentials, secrets, or regulated PII in enterprise contexts
- No pivot to domain resources, identity systems, or infrastructure
Conf.Api.Token is at least 20 random alphanumeric characters. This makes brute-force computationally infeasible regardless of the missing rate limiting.CheckAuth() path. Apply within the 365-day noisgate remediation SLA for MEDIUM findings.- WAF rate-limiting alone — while it adds friction, a determined attacker can slow-roll guesses below WAF thresholds over days/weeks if the token is short. The real fix is strong token entropy or the vendor patch.
- Network segmentation without token hardening — if the instance is on an internal VLAN accessible to compromised workstations, an insider or post-compromise attacker could still brute-force a weak token from within the network.
The supporting signals.
| In-the-wild exploitation | No evidence of active exploitation. Not listed in CISA KEV. No known campaigns targeting SiYuan brute-force. |
|---|---|
| Proof of concept | No public PoC exploit identified as of 2026-08-17. The attack is conceptually trivial (HTTP request loop) but effectiveness depends entirely on token entropy. |
| EPSS score | Not yet available — CVE disclosed 2026-08-16, EPSS model likely has not scored it yet. Expected to be low given niche attack surface. |
| KEV status | Not listed in CISA Known Exploited Vulnerabilities catalog. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H (9.8). Vector assumes network-reachable instance and trivially guessable token — both conditions fail in most deployments. |
| Affected versions | SiYuan kernel < 3.7.4 (all prior versions with API token authentication enabled) |
| Fixed version | SiYuan v3.7.4 — integrates CAPTCHA/lockout mechanisms into CheckAuth() token validation path |
| Scanning / exposure data | No significant SiYuan footprint visible on Shodan or Censys. Default desktop installs bind to localhost. Docker/VPS deployments are a small minority of the ~45k install base. |
| Disclosure date | 2026-08-16 |
| Related CVEs | CVE-2026-73046 (same component, Basic Auth branch brute-force), CVE-2026-66012 (missing authorization in MCP endpoint, pre-3.7.2), CVE-2025-31485 (auth bypass via origin trust) |
Sources.
- TheHackerWire — SiYuan Kernel API Token Brute-Force (CVE-2026-73056)
- GitHub — siyuan-note/siyuan repository
- GitHub Security Advisories — SiYuan
- THREATINT — CVE-2026-73046 (companion Basic Auth brute-force)
- RedPacket Security — SiYuan CVE Alerts
- LiuYun — SiYuan Security Flaw Exposed
- FIRST — Exploit Prediction Scoring System (EPSS)
Why this verdict
- Exposure population near zero: SiYuan is a personal knowledge management desktop app. Default installations bind the kernel to
127.0.0.1:6806. Only the Docker/VPS self-hosted minority are remotely reachable, and enterprise adoption is negligible — most 10,000-host fleets have zero SiYuan instances in their CMDB. - Token entropy kills the chain: The brute-force is only viable against short PINs or dictionary-word tokens. Any token of 12+ random alphanumeric characters (~71 bits) is computationally infeasible to guess at network speeds. The vulnerability is real but practical exploitation requires a weak token.
- Blast radius is personal-workspace-scoped: Even full exploitation yields access to notes, documents, and workspace SQL — not OS-level access, not domain credentials, not lateral movement. There is no privilege escalation to the host OS without chaining a separate RCE vulnerability.
- Role multiplier: SiYuan occupies *no* high-value infrastructure role. It is not a domain controller, identity provider, hypervisor, CI/CD server, backup system, or network edge appliance. It is a personal productivity tool. The worst plausible role is a team knowledge base on a single VPS, where compromise affects document integrity for that team — a bounded, tenant-scoped impact. No high-value-role floor applies.
- No active exploitation or KEV listing: No evidence of in-the-wild use, no campaigns, no KEV entry. The CVE was disclosed yesterday (2026-08-16) with a fix already available.
Why not higher?
To warrant HIGH, the affected component would need to occupy a high-value infrastructure role or have demonstrated active exploitation. SiYuan is a personal note-taking tool with near-zero enterprise footprint, localhost-default binding, and token-entropy-dependent exploitation. The blast radius is limited to workspace documents with no lateral movement — there is no plausible path to domain compromise, fleet impact, or regulated data exposure through this vulnerability alone.
Why not lower?
The vulnerability mechanism is real and technically sound — CheckAuth() genuinely lacks rate limiting. If an organization does run an internet-exposed SiYuan instance with a weak token (e.g., a developer's personal VPS syncing work notes), the compromise is complete within that workspace. The unauthenticated-remote attack vector with no user interaction keeps this above LOW for the narrow population that is exposed.
Crowdsourced verification payload.
Run this on any host with network access to the SiYuan instance. Invoke with: bash check_siyuan_cve2026_73056.sh <hostname:port>. No special privileges required — it makes a single unauthenticated HTTP request to check the version.
#!/usr/bin/env bash
# check_siyuan_cve2026_73056.sh — Check SiYuan kernel version for CVE-2026-73056
# Usage: bash check_siyuan_cve2026_73056.sh <host:port>
# Exit codes: 0=VULNERABLE, 1=PATCHED, 2=UNKNOWN
set -euo pipefail
if [ $# -lt 1 ]; then
echo "Usage: $0 <host:port>" >&2
echo "Example: $0 siyuan.internal:6806" >&2
exit 2
fi
TARGET="$1"
URL="https://${TARGET}/api/system/version"
# Attempt HTTPS first, fall back to HTTP
RESPONSE=$(curl -sk --connect-timeout 5 --max-time 10 "$URL" 2>/dev/null)
if [ -z "$RESPONSE" ]; then
URL="http://${TARGET}/api/system/version"
RESPONSE=$(curl -s --connect-timeout 5 --max-time 10 "$URL" 2>/dev/null)
fi
if [ -z "$RESPONSE" ]; then
echo "UNKNOWN — Could not reach SiYuan kernel at ${TARGET}"
exit 2
fi
# Extract version from JSON response
VERSION=$(echo "$RESPONSE" | grep -oP '"data"\s*:\s*"\K[0-9]+\.[0-9]+\.[0-9]+' 2>/dev/null || true)
if [ -z "$VERSION" ]; then
echo "UNKNOWN — Could not parse version from response: ${RESPONSE}"
exit 2
fi
echo "Detected SiYuan kernel version: ${VERSION}"
# Compare version — vulnerable if < 3.7.4
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
if [ "$MAJOR" -lt 3 ] || \
{ [ "$MAJOR" -eq 3 ] && [ "$MINOR" -lt 7 ]; } || \
{ [ "$MAJOR" -eq 3 ] && [ "$MINOR" -eq 7 ] && [ "$PATCH" -lt 4 ]; }; then
echo "VULNERABLE — SiYuan ${VERSION} is affected by CVE-2026-73056 (fixed in 3.7.4)"
exit 0
else
echo "PATCHED — SiYuan ${VERSION} includes the fix for CVE-2026-73056"
exit 1
fi