GHSA-3g9h-9hp4-654v

Suggest an improvement
Source
https://github.com/advisories/GHSA-3g9h-9hp4-654v
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-3g9h-9hp4-654v/GHSA-3g9h-9hp4-654v.json
JSON Data
https://api.osv.dev/v1/vulns/GHSA-3g9h-9hp4-654v
Aliases
Published
2026-03-18T20:11:00Z
Modified
2026-03-25T19:46:57.858750Z
Severity
  • 7.5 (High) CVSS_V3 - CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H CVSS Calculator
Summary
SiYuan has an Unauthenticated WebSocket DoS via Auth Keepalive Bypass
Details

Summary

The SiYuan kernel WebSocket server accepts unauthenticated connections when a specific “auth keepalive” query parameter is present. After connection, incoming messages are parsed using unchecked type assertions on attacker-controlled JSON.

A remote attacker can send malformed messages that trigger a runtime panic, potentially crashing the kernel process and causing denial of service.

Details

1. Authentication Bypass via Keepalive Query

Unauthenticated connections are accepted if the request URI matches a specific pattern intended for an authentication page keepalive.

File: kernel/server/serve.go

if !authOk {
    authOk = strings.Contains(s.Request.RequestURI, "/ws?app=siyuan") &&
             strings.Contains(s.Request.RequestURI, "&id=auth&type=auth")
}

2. Unsafe Type Assertions on Untrusted Input

Incoming JSON messages are parsed into a generic map and fields are accessed without validation.

File: kernel/server/serve.go

cmdStr := request["cmd"].(string)
cmdId  := request["reqId"].(float64)
param  := request["param"].(map[string]interface{})

Malformed or missing fields trigger a runtime panic. The handler does not implement local panic recovery, allowing crashes to propagate.

PoC

Step 1 — Prepare workspace directory

mkdir -p ./workspace

Step 2 — Run SiYuan container

docker run -d \
  -p 6806:6806 \
  -e SIYUAN_ACCESS_AUTH_CODE_BYPASS=true \
  -v $(pwd)/workspace:/siyuan/workspace \
  b3log/siyuan \
  --workspace=/siyuan/workspace

Service becomes reachable at http://127.0.0.1:6806

Step 3 — Confirm service availability

Open in browser:

http://127.0.0.1:6806

Step 4 — Connect to unauthenticated WebSocket endpoint

ws://127.0.0.1:6806/ws?app=siyuan&id=auth&type=auth

This connection is accepted without credentials.

Step 5 — Send malformed payload

Payload:


{}

Step 6 — Observe behavior

Monitor container logs:


docker logs -f <container_id>

Impact

An unauthenticated attacker with network access can repeatedly crash the kernel, causing persistent denial of service.

Impact is highest when the service is exposed beyond localhost (e.g., Docker deployments, reverse proxies, LAN access, or public hosting).

Database specific
{
    "cwe_ids": [
        "CWE-248",
        "CWE-306"
    ],
    "github_reviewed_at": "2026-03-18T20:11:00Z",
    "nvd_published_at": "2026-03-20T23:16:45Z",
    "severity": "HIGH",
    "github_reviewed": true
}
References

Affected packages

Go / github.com/siyuan-note/siyuan/kernel

Package

Name
github.com/siyuan-note/siyuan/kernel
View open source insights on deps.dev
Purl
pkg:golang/github.com/siyuan-note/siyuan/kernel

Affected ranges

Type
SEMVER
Events
Introduced
0Unknown introduced version / All previous versions are affected
Fixed
3.6.2

Database specific

last_known_affected_version_range
"<= 3.6.1"
source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/03/GHSA-3g9h-9hp4-654v/GHSA-3g9h-9hp4-654v.json"