Open-Source Security Intelligence

Know every vulnerability
before it knows you.

DevGuard continuously monitors your dependencies and alerts you when CVEs like this one affect your stack — with real-time threat intelligence built for developers.

Search

GHSA-r3g7-r4hr-m258

HighCVSS 7.1 / 10
Published Oct 23, 2026·Last modified Oct 23, 2026
Affected Components(1)
npm logoobsidian-tc
1.0.1 – 1.31.4
Description

Summary

create_entity, link_entities, rename_entity, unlink_entities and delete_entity regenerate a memory note's body from SQLite at the computed memory/<type>/<name>.md path. When a note already existed at that path and was not owned by the entity being written (a hand-authored note, or an orphan left by a different entity whose name sanitized to the same path), its entire body was overwritten on the next write naming that (type, name), keeping only its frontmatter. Separately, several of these tools inserted or removed their SQLite row before the fallible filesystem step, so a refused note write could leave a relation gone, a retired status committed, or the wrong entity deleted.

Details

  • create_entity and link_entities inserted the SQL row or relation before materialization.
  • rename_entity seeded the destination path with a direct atomic write that bypassed the ownership check, and for a status-only rename could commit a retired status with the note write refused.
  • unlink_entities removed the relation row before discovering the source note's rematerialization would be refused.
  • delete_entity's cascade could delete the target and its relations before a neighbour's note was found to be foreign.

The overwrite exists in every released version since materializeEntity shipped (git show v1.0.1:packages/server/src/memory/materialize.ts).

Impact

An authorized caller with memory-write scope (any agent using the M5 memory tools) can, without intending to, destroy the body of a vault note outside the entity it is writing, and can leave the memory graph inconsistent with the notes on disk. Snapshots-before-write (restore_note) mitigate the overwrite only where snapshots are enabled and the note had been written through obsidian-tc before.

Patches

Fixed in 1.31.4 at the shared primitive: materializeEntity refuses to write over a note whose obsidian_tc_id is missing or belongs to another entity; a new assertNoteOwnership pre-check runs before any SQLite mutation in the three lifecycle tools, so a refusal is a no-op; create_entity and link_entities roll back the row they had inserted. Verified by test/m5-memory-ownership.test.ts, which covers all five call sites and the rollback.

Workarounds

None that preserve the tools. Disabling the write:memory scope for callers prevents the write path entirely.

Credit

Found by the maintainer while building obsidian-tc memory import (PR #978); the vulnerability class was independently confirmed by a cross-vendor adversarial review.

References

  • PR #978 (fix and test), CHANGELOG ## [1.31.4] ### Security
  • packages/server/src/memory/materialize.ts, packages/server/src/tools/m5/memory-lifecycle-tools.ts

Upload your SBOM

Upload your own SBOM in CycloneDX 1.6 or higher (JSON) directly here to check your vulnerabilities.

Risk Scores
Base Score
7.1

The vulnerability can be exploited over the network without needing physical access. It is easy for an attacker to exploit this vulnerability. An attacker needs basic access or low-level privileges. No user interaction is needed for the attacker to exploit this vulnerability.

Threat Intelligence
5.0

Exploitation attempts have been detected. Elevated vigilance and prompt remediation are advised.

EPSS
0.32%

The exploit probability is very low. The vulnerability is unlikely to be exploited in the next 30 days.

Exploit
Not available

We did not find any exploit available. Neither in GitHub repositories nor in the Exploit-Database.

Related Vulnerabilities

Browse More

Scan your project

Continuously monitor your dependencies and get alerted when vulnerabilities like this one affect your stack.

Checkout DevGuard