CVE-2026-115477
HighCVSS 7.1Summary
In obsidian-tc from 1.13.0 until 1.31.4, a Streamable HTTP deployment with `auth.jwtSecret` configured allowed bypassing human confirmation for dispatch-gated destructive tool calls. The server trusted a validly bound `requestState` as proof of approval even though that state was minted before the `elicitation/create` leg and only proved the resubmission belonged to the same call. A misbehaving or attacker-controlled client could therefore execute destructive vault operations without human approval while still requiring the caller's ordinary tool permissions.
Risk Assessment
An organization using obsidian-tc over Streamable HTTP with `auth.jwtSecret` may experience unauthorized destructive operations on the Obsidian vault (e.g., overwriting or moving notes) without the user's knowledge or consent. The risk applies only to tools marked `destructive: true` or requiring a scope with a human-in-the-loop floor.
Recommendation
Update obsidian-tc to version 1.31.4 or later. If updating is not possible, consider switching to stdio transport or removing the `auth.jwtSecret` configuration, which forces the `elicit_token` fallback and eliminates this bypass path.
Other vulnerabilities in obsidian-tc
See all- CVE-2026-115478High
In obsidian-tc from 1.0.1 until 1.31.4, the create_entity, link_entities, rename_entity, unlink_entities and delete_entity tools regenerate memory notes from SQLite at the computed memory/<type>/<name>.md path without reliably preserving note ownership, so a hand-authored note or an orphan from another entity sanitizing to the same path could have its entire body overwritten. Additionally, several tools mutate SQLite before fallible filesystem work, so a later filesystem failure can leave the memory graph inconsistent with notes on disk even when the operation failed.
- CVE-2026-77366Critical
In obsidian-tc prior to 1.3.1, tool dispatch does not compare the caller-controlled input.vault value with the vault bound to the caller, the JWT has no vault claim, and the folder access-control list is shared globally. Any valid token can therefore select another configured vault and read, write, or delete its contents through affected tools.
- CVE-2026-77362Medium
obsidian-tc prior to 1.3.1 does not consistently apply the read access-control list (ACL) to every returned field. The tasks_filter tool exposes group counts derived from denied notes, makemd_query passes unfiltered sibling result fields through, and list_templates exposes template paths and parsed user-function bodies without a read-whitelist check. An authenticated caller can consequently infer or read data from notes outside the caller's read ACL.
- CVE-2026-77361Medium
obsidian-tc prior to 1.3.1, read access-control list (ACL) checks use a lexical vault-relative path while containment checks use the resolved path. An in-vault symlink under an allowed glob that resolves into a denied folder can therefore bypass the read ACL and expose files in the denied folder. Exploitation requires an out-of-band-planted symlink and does not permit an escape from the vault root.
- CVE-2026-77364Medium
obsidian-tc is a governed, agent-ready Model Context Protocol server for Obsidian vaults. Prior to 1.3.1, undefined readPaths and writePaths settings allow all paths, strictReadDefault does not protect direct requests, and the .obsidian, .git, and .trash control directories are excluded only during enumeration. An authenticated caller can directly read sensitive files such as .obsidian/plugins/*/data.json.
- CVE-2026-77363High
A vulnerability in obsidian-tc, a Model Context Protocol server for Obsidian vaults, before version 1.3.1, does not validate Host or Origin headers or enable DNS-rebinding protection in the Streamable HTTP transport. With loopback configuration using auth.mode set to none, a malicious web page can send requests to the local MCP endpoint and gain unrestricted vault access via the http-local caller. Version 1.3.1 fixes the issue by enabling host, origin, and DNS-rebinding validation.
Original NVD description (English source)
obsidian-tc is a governed, agent-ready Model Context Protocol server for Obsidian vaults. From 1.13.0 until 1.31.4, on a Streamable HTTP deployment with `auth.jwtSecret` configured and a 2026-07-28-era client declaring `elicitation.form` support, a dispatch-gated tool call offered an `inputRequired` confirmation could still complete after the human declined or cancelled, or the elicitation response was omitted or malformed, provided the client echoed the validly bound `requestState` on resubmission. The server trusted an authentic, call-bound state as proof of approval even though that state was minted before the `elicitation/create` leg was asked and proved only that the resubmission belonged to the same call. A client behaving incorrectly or under an attacker's control could therefore execute dispatch-gated destructive vault operations without the human's approval, while still requiring the caller's ordinary tool permissions. Only tools marked `destructive: true` or requiring a scope with a human-in-the-loop floor were reachable through this bypass. The sixteen handler-side conditionally gated tools, including `write_note` overwrite and `move_note`, did not read elicitation state on the modern wire and let neither approval nor decline through that path. Affected deployments using stdio or leaving `auth.jwtSecret` unset instead used the CLI `elicit_token` fallback and did not offer this `requestState` round trip. The fix does not prevent a malicious client from reporting a fabricated approval, because the server cannot verify that the client displayed the form or that a human saw it. This issue is fixed in version 1.31.4.
Vulnerability data from NVD (NIST) · CISA KEV · EPSS

