ekofyi
A Leaked Cookie Signing Key Is an Auth Failure, Not a Configuration Bug
Security Research10 min read

A Leaked Cookie Signing Key Is an Auth Failure, Not a Configuration Bug

CVE-2026-72793 exposes sensitive SiYuan configuration data through an API endpoint available to anonymous or publish-reader users. If you run SiYuan before v3.7.4, treat this as a potential authentication compromise and patch accordingly.

On August 12, 2026 — two days ago — CVE-2026-72793 was published for SiYuan versions before v3.7.4. The root issue sounds mundane: the /api/system/getConf endpoint does not properly mask sensitive configuration fields.

It isn't mundane.

According to the advisory, anonymous users or users with publish-reader access can retrieve the session-cookie signing key, an OS username exposed through the pandoc path, and encrypted-notebook key material. The signing key is the part that should make every defender stop what they are doing.

A cookie signing key is not ordinary application configuration. It is part of the trust boundary for authentication. If an attacker has it, they may be able to forge or alter session cookies and impersonate users. On SiYuan instances without access-auth codes configured, the advisory says this can lead to administrator privilege escalation.

That turns a read-style configuration disclosure into an authentication problem. Potentially an administrative one.

The fix is available in SiYuan v3.7.4. If you operate an earlier version, patching should be the first move. But don't stop at the update. A secret that may already have been exposed has a different operational meaning than a secret that was merely at risk of exposure.

Why "masked fields" is a security control, not a cosmetic one

There is a recurring engineering mistake behind bugs like this: treating configuration APIs as harmless because they are intended to support a settings page, diagnostics, or frontend initialization.

That assumption falls apart as soon as a configuration response contains secrets.

A configuration object often starts small. A few feature flags. A UI preference. Some metadata. Then, over time, more fields get attached because returning one convenient object is easier than maintaining explicit response models. Credentials, internal paths, encryption-related material, tokens, and operational details can gradually hitch a ride.

At that point, the endpoint has become a secret-bearing API. It needs the same design discipline as an authentication endpoint or an administrative export feature.

The problem described in CVE-2026-72793 is not simply that a value appeared in JSON. The problem is that the system exposed data that should remain server-side to users who are anonymous or have only publish-reader access.

That distinction matters.

A publish-reader role may be intentionally low privilege. Anonymous access is lower still. Neither should imply permission to retrieve the material used to establish or validate authenticated sessions. If a user can read published content, that does not mean they should be able to obtain the cryptographic basis for becoming another user.

Secrets do not become safe because they live under a route named getConf instead of a route named getSecrets.

The advisory is categorized as CWE-522, Insufficiently Protected Credentials. That is the right framing. The exposed session-cookie signing key is credential material in the broadest, most important sense: it is part of what the application trusts when it decides who a request belongs to.

Why the cookie signing key changes the severity of this bug

Information disclosure findings are often underestimated because people focus on what was read, not what that data enables.

An OS username may help an attacker understand an environment. Encrypted-notebook key material may have serious consequences depending on how it is used. But the session-cookie signing key is the immediate escalation path called out by the advisory.

Session cookies commonly encode some claim about the current user or session, plus a cryptographic signature intended to prevent tampering. The server verifies that signature before it trusts the cookie.

The signing key is the thing that makes this work.

If an attacker obtains that key, the protection can fail at its foundation. Rather than stealing a particular user's existing browser session, an attacker may be able to create or modify session cookies that the server accepts as authentic. The advisory explicitly states that attackers can forge and tamper with session cookies to impersonate users.

This is why I would not file this mentally under "some configuration metadata leaked." It is closer to exposing an authentication signing secret.

The reported CVSS 4.0 vector from VulnCheck is CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N. Read the operational parts plainly:

  • Network reachable: the vulnerable behavior is accessible over the network.
  • Low attack complexity: the advisory does not describe a complex chain as a prerequisite.
  • No privileges and no user interaction required: this is especially important for an endpoint available to anonymous users or publish readers.
  • High confidentiality impact: the disclosed data includes sensitive secret material.
  • Subsequent-system confidentiality impact: the attack can have consequences beyond merely viewing a configuration response.

The weakness is exposed precisely where teams are often most relaxed: unauthenticated and low-privilege application surfaces.

What SiYuan operators should do now

If you run SiYuan, first determine whether your deployment is on a version before v3.7.4. The advisory identifies all versions before v3.7.4 as affected.

Upgrade to SiYuan v3.7.4 or later as soon as your change process allows. Don't treat this as an optional maintenance update.

Then work through the more uncomfortable question: could the vulnerable endpoint have been accessed before the upgrade?

The supplied advisory content does not provide detection queries, logging locations, or a vendor-prescribed secret-rotation procedure. That means I would avoid inventing a checklist that looks precise but isn't. Your deployment and its telemetry will determine what is possible to verify.

Still, the response priorities are clear.

1. Patch the affected version

Upgrade from any release before v3.7.4. This removes the known exposure condition described in the CVE.

A perimeter workaround is not equivalent to the application fix. Restricting network access can reduce exposure, but it does not change the fact that the vulnerable version handles sensitive configuration fields incorrectly.

2. Treat the signing key as potentially exposed

This is the step teams skip because it causes disruption.

If there is a credible possibility that an anonymous or publish-reader user could have reached /api/system/getConf while the instance was vulnerable, assess whether the session-cookie signing key can be rotated through SiYuan's supported configuration and operational process.

The reason is simple: patching prevents future disclosure. It does not make a key private again if it was already retrieved.

Any secret rotation must be planned carefully because changing session-signing material commonly invalidates existing sessions. That disruption is often the correct tradeoff. A user signing in again is cheaper than allowing an attacker to retain the ability to manufacture trusted sessions.

Do not casually edit production configuration files based on guesswork. Use the project's documented administrative process and test the impact where possible.

3. Review whether access-auth codes are configured

The advisory specifically notes that instances without access-auth codes configured can be escalated to administrator privileges.

That makes this setting an immediate review item. Confirm whether your instance has the relevant access-auth protections configured and whether they are operating as intended.

This is not a substitute for upgrading. It is defense in depth, and defense in depth only works when the primary exposure is also removed.

4. Preserve and inspect relevant access records

Before logs roll over, preserve what you have. Look for requests to /api/system/getConf during the period an affected version was exposed.

Pay particular attention to:

  • Requests from unexpected internet-facing addresses.
  • Anonymous access patterns that do not match normal use of your instance.
  • Publish-reader activity followed by unusual authenticated activity.
  • Administrative actions or sessions that cannot be tied to expected users.

A missing log entry is not proof that the endpoint was never accessed. Logging varies, reverse proxies may not retain enough detail, and some deployments may have no useful historical request data. But checking is still worthwhile because evidence gathered now can guide whether secret rotation and broader account-response actions are necessary.

5. Reassess public exposure

The endpoint is particularly concerning because anonymous users are included in the affected access conditions. Ask a blunt question: does this SiYuan instance actually need to be reachable by the public internet?

If the answer is no, place it behind the access controls appropriate for your environment. If the answer is yes, minimize what unauthenticated and publish-reader users can reach, keep the service updated, and make sure edge logging exists before the next incident forces you to wish it did.

Public availability is not automatically wrong. Public availability without a clear model of what each route reveals is where trouble starts.

The engineering lesson: response objects need ownership

The long-term fix for this class of issue is not "remember to mask fields." That instruction is too vague, too easy to forget, and too dependent on every future contributor understanding which fields are dangerous.

A safer design is to make the API response a deliberately defined public object.

Do not serialize an internal configuration structure and then try to remove sensitive fields afterward. Build a response model containing only values the caller is meant to receive. Keep signing keys, encryption material, and server-only paths out of that model entirely.

This is the difference between a denylist and an allowlist mindset:

  • A denylist says, "Return the config, except for the secrets we remembered to remove."
  • An allowlist says, "Return only these explicitly approved fields."

For endpoints that can be reached anonymously or by low-privilege roles, the second approach should be the default.

Authorization should also be checked before creating a response that contains privileged fields. It is not enough to build a complete object and hope a masking layer behaves correctly under every role, mode, and future feature change. Sensitive data should not enter a low-trust response path in the first place.

And cryptographic signing keys deserve their own category in a threat model. They are not just another setting. They are trust roots. Code review should ask a direct question whenever one is loaded into memory: can this value ever cross a process, API, log, diagnostic, error, or client boundary?

If the answer is "possibly," that is a design issue waiting to become an incident.

Low-privilege paths are where attackers start

I think the most useful takeaway from CVE-2026-72793 is broader than SiYuan.

Teams are generally careful around obvious admin pages. They put those behind authentication, add role checks, and scrutinize the dangerous buttons. But read-only, publishing, preview, bootstrap, and configuration endpoints receive less suspicion because they are perceived as passive.

Attackers do not care whether a route was meant to be passive. They care whether it changes what they can know or what they can convincingly pretend to be.

A configuration endpoint that leaks a cookie signing key does both.

SiYuan operators should upgrade to v3.7.4 or later, evaluate exposure of the signing key and other listed material, verify access-auth code configuration, and retain whatever request evidence they can. Everyone else building web software should take the design lesson seriously: the moment an API response contains a secret, that route is part of your authentication and authorization boundary — whether the codebase treats it that way or not.

Related posts

Written by Eko

If you found this useful, follow @ekofyi on X for more notes like this — or get in touch if you have a problem to solve.