Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate to obsidian-tc MCP server
-
ExploitIssue direct read_note on control path
-
ExecutionBypass enumeration-only directory filter
-
ImpactExfiltrate plugin keys and Sync passwords
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V14 - Data Protection Data exposure prevention
MITRE ATT&CK
2 techniques across 2 tactics: Collection, Discovery The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires an authenticated caller to the obsidian-tc MCP server (PR:L) issuing a direct file request (e.g. read_note) rather than enumeration. The flaw is present in default/back-compat configurations where readPaths and writePaths are undefined (allow-all) in versions prior to 1.3.1; the pre-fix strictReadDefault setting was silently stripped by config validation, so even operators who set it gained no protection on the request path. Control directories (.obsidian, .git, .trash) were filtered only during enumeration, not on direct paths, so '.obsidian/plugins/*/data.json' and similar were directly readable. Limiting factors: the attacker must already hold valid authentication to the server, and no code execution or data modification is possible - impact is confined to confidentiality. |
| Impact | This is a genuine but moderate-priority information-disclosure flaw (CWE-200), not an overblown high-CVSS issue. The CVSS 3.1 base score of 6.5 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N) is consistent with the description: a network-reachable MCP server where an already-authenticated caller can read secrets, with high confidentiality impact but zero integrity or availability impact. No EPSS score was provided, so statistical exploitation probability cannot be weighed. The vulnerability is NOT in CISA KEV and no public exploit code is referenced, so exploitation status is 'no public exploit identified at time of analysis' - though the fix commit (74de320) and GHSA-cvp8-vvgf-69q4 publicly document the exact trigger (read_note('.obsidian/plugins/*/data.json')), which lowers the bar for a trivial reproduction. No SSVC decision data was supplied. The key limiting factor is PR:L: the attacker must already be an authenticated caller of the MCP server, which reduces real-world urgency from 'drop everything' to 'patch promptly, especially in multi-tenant or shared-agent deployments.' Signals are internally consistent - no conflicts between the CVSS vector and the description. |
| Exploit ScenarioDerived | An authenticated user (or a compromised/over-privileged AI agent) connected to the obsidian-tc MCP server calls read_note with a direct path such as '.obsidian/plugins/<plugin>/data.json', bypassing the enumeration-only directory filter. Because undefined readPaths default to allow-all and strictReadDefault was not enforced on direct requests, the server returns the file contents, exposing plugin API keys and Obsidian Sync passwords. No public exploit is referenced, but the fix commit explicitly documents the exact vulnerable call pattern. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 12, 2026
obsidian-tc versions prior to 1.3.1 fail to enforce folder access controls on direct file requests, allowing an authenticated MCP caller to read vault control-directory files such as .obsidian/plugins/*/data.json, which routinely store plugin API keys and Obsidian Sync passwords. Because an undefined readPaths/writePaths whitelist defaults to allow-all (a deliberate M0 back-compatibility behavior) and the strictReadDefault guard was silently stripped by config validation and never applied to direct request paths, even operators who believed they had locked the server down received no protection; .obsidian, .git, and .trash were filtered only during enumeration. The issue is a moderate-priority confidentiality-only flaw (CWE-200, CVSS 6.5, PR:L) with no integrity or availability impact and no public exploit identified at time of analysis; the vendor-released fix in v1.3.1 adds a hard default-deny baseline for control directories plus schema and request-path enforcement of strictReadDefault.
RemediationAI
Upgrade to obsidian-tc v1.3.1 (vendor-released patch; release notes at https://github.com/The-40-Thieves/obsidian-tc/releases/tag/v1.3.1, fix commit 74de320ddea855e1dec47d67beabe88491149dab, PR https://github.com/The-40-Thieves/obsidian-tc/pull/73), which adds a hard default-deny baseline for .obsidian/, .git/, and .trash/** across read, write, and delete, wires isDefaultDenied() into the direct request helpers in cli.ts, notes-tools.ts, search-tools.ts, and knowledge-tools.ts, and adds strictReadDefault to the config schema so the setting is no longer stripped and is honored on the request path. Because the fix is not retroactive, upgrade rather than reconfigure. If upgrading is not immediately possible, the effective compensating controls are: explicitly define both readPaths and writePaths in the ACL config with narrow globs so the allow-all back-compat branch is never taken (trade-off: any vault path not matched becomes unreadable, which may break agent workflows until the globs are tuned); set strictReadDefault: true so an undefined readPaths list denies rather than allows (trade-off: same broad loss of access, and note that on pre-1.3.1 this value is dropped by validation so it must be combined with explicit whitelists to have any effect); block control directories at the filesystem layer by running the server against a vault copy or mount with .obsidian, .git, and .trash excluded and ACLs denying the server's OS user (trade-off: bookmark/workspace tooling that reads .obsidian/bookmarks.json and .obsidian/workspaces.json will stop working); and restrict network reachability plus authenticate and rotate any credentials that may already have been exposed, specifically Obsidian Sync passwords and all plugin API keys stored in .obsidian/plugins/*/data.json, since read access alone is sufficient to exfiltrate them. No vendor-released patch exists for versions below 1.3.1 and no public exploit code has been identified, so prioritization should reflect the confidentiality-only, authenticated-caller nature of the flaw.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
obsidian-tc is an agent-ready Model Context Protocol (MCP) server that exposes an Obsidian vault to AI agents through tools such as read_note (M1), search (M2), and knowledge tools (M7), all gated by a FolderAcl composed of readPaths/writePaths glob lists. The root cause is CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor) arising from a fail-open default combined with an incomplete enforcement point: when readPaths or writePaths is undefined the ACL treats the vault as allow-all for back-compatibility, and the control-directory exclusion list (.obsidian, .git, .trash) was applied only by the bridge enumeration/indexing code rather than by the per-request authorization helpers (indexReadable, the M1/M2/M7 readable() functions). Additionally, strictReadDefault was not present in the config schema, so validation stripped it before it could influence any decision. The fix introduces DEFAULT_DENY_ROOTS = ['.obsidian', '.git', '.trash'] with an explicit exemption set for .obsidian/bookmarks.json and .obsidian/workspaces.json (needed by the bookmark/workspace tools), exports an isDefaultDenied() predicate, wires it into every read path across cli.ts, notes-tools.ts, search-tools.ts, and knowledge-tools.ts, adds strictReadDefault to the config schema, and changes the undefined-whitelist branch to return acl.strictReadDefault !== true. The affected CPE is cpe:2.3:a:the-40-thieves:obsidian-tc:*:*:*:*:*:*:*:* for all versions before 1.3.1.
Know when Obsidian Tc gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Network-reachable MCP server (AV:N), no special conditions (AC:L), requires an authenticated caller (PR:L), no user interaction; high confidentiality from leaked secrets, no integrity or availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
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, potentially exposing plugin API keys, Obsidian Sync passwords, and other in-vault data. Version 1.3.1 fixes the vulnerability by denying the control directories by default and enforcing strictReadDefault on direct request paths.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
More in Obsidian Tc
View allImproper authorization in obsidian-tc prior to 1.3.1 lets any holder of a valid JWT reach beyond its own vault and read,
Cross-origin requests to the obsidian-tc Model Context Protocol HTTP transport let any web page a victim visits read fro
Read access-control bypass in obsidian-tc before version 1.3.1 allows an authenticated MCP client to read files inside a
Information disclosure in obsidian-tc (versions prior to 1.3.1) allows an authenticated caller of the MCP server to infe
EUVD-2026-97736
NVD
CVE.org
EPSS
GitHub
Exploit-DB