This release includes 1 security fix for security teams reviewing exposed deployments.
Affected surfaces
Summary
AI summaryFixed a path-allowlist bypass vulnerability that allowed .. segments to escape the configured read/write allowlists.
Full changelog
Security and correctness patch on top of 1.8.0. Upgrade strongly recommended for any deployment that uses OBSIDIAN_READ_PATHS or OBSIDIAN_WRITE_PATHS.
Critical
A path-allowlist bypass via .. segments was found in assertAllowed. v1.8.0 evaluated the allowlist against the raw user-supplied path before path.resolve collapsed ... A request like Allowed/../OtherFolder/note.md slipped past the prefix check (the string starts with Allowed/) and the resolved read or write landed in a folder outside the allowlist. The vault-traversal check still passed because the resolved path stayed inside the vault root, so the bypass was invisible to the existing guards.
Fixed: assertAllowed now collapses .. via path.posix.normalize and rejects any path whose normalized form climbs above its starting point. Six regression tests cover the bypass classes (escape into a different folder, climb above vault root, leading .., backslash-encoded variant, write-side variant, plus an allowed traversal that lands back inside the same folder).
If you run with allowlists set, upgrade now.
High
- HTTP timeout on every embedding-provider fetch (
AbortSignal.timeout(30_000)). A hung Ollama or OpenAI endpoint used to hang the tool call indefinitely and hold the MCP session open. - TOCTOU race in
rename_tagclosed. Rewrites now run inside theupdateNotetransform so concurrent writes between the read and the lock-acquired write can no longer be silently overwritten. search_semanticandfind_similar_notesinvalidate stale vectors. Switching embedding models and querying before re-indexing used to produce meaningless cosine scores with no warning. Both tools now callinvalidateIfIncompatibleafterloadStore.
Medium
- Bases filter recursion guard.
evaluateFilternow caps recursion at 64 levels so a pathological.basefile with deeply nestedand/or/notblocks can no longer overflow the V8 stack. updateNoteskips disk writes when the transform returned unchanged content. No more spurious mtime bumps from no-op tools (replace_in_notewith zero matches,rename_tagon notes without occurrences).- Provider error bodies truncated to 200 chars before interpolation into thrown
Errormessages.
Low
- Empty
acceptelicitation responses are now cancellations, not errors.delete_noteno longer surfaces an error when the user dismisses the form without filling it in. - Cache snapshot eviction order is now deterministic. Entries are sorted by content length ascending before serialization so small entries fill the 64 MB budget first.
update_sectionreports accurate byte counts usingBuffer.byteLengthinstead ofstring.length(off by 2x for multi-byte content).
Tests
- 444 passing (was 438), +6 regression tests on the permission bypass classes.
Install or upgrade
npx -y [email protected] install
Or pin in your MCP client config:
{
"mcpServers": {
"obsidian": {
"command": "npx",
"args": ["-y", "[email protected]"]
}
}
}
Full changelog: CHANGELOG.md
Security Fixes
- CVE‑2025‑XXXXX – Path‑allowlist bypass via `..` segments fixed in `assertAllowed` (normalizes paths and rejects upward traversal).
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About rps321321/obsidian-mcp-pro
Feature-complete Obsidian vault MCP server with 23 tools and 3 resources. Full-text search, note CRUD, frontmatter queries, tag management, backlinks, graph traversal (BFS up to 5 hops), orphan/broken link detection, and canvas support. Auto-detects vault, path traversal protection, MIT licensed.
Related context
Beta — feedback welcome: [email protected]