Skip to main content

obsidian-tc EUVDEUVD-2026-97736

| CVE-2026-77364 MEDIUM
Information Exposure (CWE-200)
2026-10-12 GitHub_M
6.5
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate to obsidian-tc MCP server
  2. Exploit
    Issue direct read_note on control path
  3. Execution
    Bypass enumeration-only directory filter
  4. Impact
    Exfiltrate 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

obsidian-tc < 1.3.1

Affected Packages

euvd obsidian_tc fix: 1.3.1

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

Vendor (GitHub_M) PRIMARY 6.5 MEDIUM
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
vuln.today AI 6.5 MEDIUM

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.

3.1 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
None
Availability
None

Lifecycle Timeline

1
Patch available
Oct 12, 2026 - 19:03 EUVD

DescriptionCVE.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

EPSS Score
0.2%
Top 86% exploitable
Prevalence
Rare
niche open-source MCP server for Obsidian, tiny deployment footprint
Social Media
1
Sightings
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

32
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +32
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy