---
id: "CVE-2026-77364"
kind: "vulnerability"
aliases: ["CVE-2026-77364", "GHSA-cvp8-vvgf-69q4"]
title: "obsidian-tc: Default folder ACL is fail-open; .obsidian plugin secrets are readable by default"
severity: "medium"
cvss: 6.5
epss: 0.0023799999617040157
exploited: false
status: "open"
category: "package"
products: [{"name": "obsidian-tc", "fixed": ["1.3.1"], "affected": "< 1.3.1", "ecosystem": "npm"}]
ecosystems: ["npm"]
tags: ["cwe-200", "cwe-276", "node", "npm", "obsidian", "obsidian-tc", "package"]
not_affected_if: ["explicit-readpaths-writepaths-excluding-control-dirs", "version-1.3.1-or-later"]
published_at: "2026-10-12T18:17:23+00:00"
first_seen_at: "2026-10-23T19:11:31+00:00"
updated_at: "2026-10-23T23:44:52+00:00"
sources: [{"source": "ghsa", "url": "https://github.com/advisories/GHSA-cvp8-vvgf-69q4", "first_seen_at": "2026-10-23T19:11:31+00:00"}, {"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-77364", "first_seen_at": "2026-10-23T23:44:52+00:00"}]
---

# obsidian-tc: Default folder ACL is fail-open; .obsidian plugin secrets are readable by default

obsidian-tc is an npm package whose default folder access rules fail open, so with default configuration any caller can read files by path, including .obsidian/plugins/*/data.json. An attacker can read plugin API keys and Obsidian Sync passwords, plus any other file in the vault.

_Summary, check and fix written by a model from the sources; labelled as such._

## Affected

- npm:obsidian-tc affected < 1.3.1 fixed 1.3.1

## How to check

Run npm ls obsidian-tc to see the installed version; below 1.3.1 is affected.
If below 1.3.1, check whether readPaths and writePaths are explicitly set and exclude .obsidian, .git and .trash.

## Fix

Upgrade obsidian-tc to 1.3.1 or later.
Workaround: set explicit readPaths and writePaths allowlists that exclude .obsidian, .git and .trash.

## Timeline

- 2026-10-23T19:11:31+00:00 ghsa https://github.com/advisories/GHSA-cvp8-vvgf-69q4
- 2026-10-23T23:44:52+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-77364

## From the sources

### Impact
With a default configuration, an undefined `readPaths`/`writePaths` meant allow-all, the `strictReadDefault` flag was inert, and the `.obsidian`/`.git`/`.trash` control directories were denied only during enumeration — not on the direct request path. A caller could read `.obsidian/plugins/*/data.json`, exfiltrating **plugin API keys and Obsidian Sync passwords** (live-reproduced), as well as any other in-vault file by path.

### Patches
Fixed in **1.3.1**. Upgrade to `>= 1.3.1`. The default now denies `.obsidian`/`.git`/`.trash` on read/write/delete and honors `strictReadDefault` on the request path.

### Workarounds
Set an explicit `readPaths`/`writePaths` whitelist that excludes the control directories.

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
