CVE-2026-115477: obsidian-tc: HITL approval bypass runs destructive tools

GHSA-737x-cwfr-5vvcHIGH
Published October 23, 2026
CISO Take

obsidian-tc, an MCP server that lets AI agents operate on Obsidian vaults, trusted a validly bound requestState as proof that a human approved a destructive action, so a client could run dispatch-gated destructive tools after the human declined, cancelled, or never answered the confirmation prompt. This defeats the human-in-the-loop control that many organizations rely on to keep agents from deleting or overwriting data. It is limited to Streamable HTTP deployments with auth.jwtSecret set (versions 1.13.0 to before 1.31.4), and the caller still needs ordinary tool permissions. There is no KEV listing, public exploit, or EPSS score yet, and the package has no tracked dependents, so exposure is likely narrow but worth checking for anyone running agent-managed knowledge bases. Upgrade to 1.31.4 and treat client-side elicitation as advisory, not a security boundary: the fix cannot stop a malicious client from reporting a fabricated approval, so keep backups and restrict destructive scopes.

Sources:NVDGitHub AdvisoryATLAS

What is the risk?

High severity per the vendor advisory (no CVSS vector published), mapping to CWE-285 and CWE-863 (improper and incorrect authorization). Exploitation needs network access to the Streamable HTTP endpoint, a valid JWT, and tool permissions for the targeted operation. It also needs a client that replays the bound requestState without a real approval, which is trivial for a custom or compromised client or an agent harness that mishandles elicitation. No active exploitation, KEV listing, public exploit, or scanner template is known. Residual risk remains after patching because the server cannot verify that a human actually saw the approval form.

How does the attack unfold?

Initial Access
Attacker holds a valid JWT and controls or compromises an MCP client connected to the Streamable HTTP server.
AML.T0012
Tool Invocation
The client calls a dispatch-gated destructive tool and receives an inputRequired response with a bound requestState.
AML.T0053
Approval Bypass
The client resubmits the valid requestState despite a decline, cancel, or omitted or malformed elicitation response, and the server accepts it as approval.
AML.T0053
Impact
The destructive vault operation executes without human consent, causing data loss or tampering.
AML.T0101

What systems are affected?

PackageEcosystemVulnerable RangePatched
Clinenpm>= 1.13.0, <= 1.31.31.31.4
70.8K2 dependentsPushed 7d ago75% patched~19d to patchFull package profile →
obsidian-tc——No patch

How severe is it?

CVSS 3.1
N/A
EPSS
0.4%
chance of exploitation in 30 days
Higher than 29% of all CVEs
Exploitation Status
No known exploitation
Sophistication
Moderate

What should I do?

1 step
  1. 1) Upgrade obsidian-tc to 1.31.4 or later. 2) Until patched, remove destructive scopes from agent and client credentials, or switch to stdio or a deployment without jwtSecret that uses the elicit_token fallback. 3) Take versioned backups or snapshots of Obsidian vaults (git or filesystem snapshots) so destructive operations can be rolled back. 4) Audit server logs for destructive tool calls that lack a matching elicitation/create response with an accept action. 5) Apply least privilege to JWT scopes and restrict network access to the MCP endpoint. 6) Do not rely on client-reported approval for high-impact actions; add an out-of-band approval or server-side policy where possible.

How is it classified?

Which compliance frameworks are affected?

This CVE is relevant to:

EU AI Act
Article 14-Human oversight
ISO 42001
A.9.2-Processes for responsible use of AI systems
NIST AI RMF
GOVERN 1.3-Risk management processes and oversight
OWASP LLM Top 10
LLM06-Excessive Agency

Frequently Asked Questions

What is CVE-2026-115477?

obsidian-tc, an MCP server that lets AI agents operate on Obsidian vaults, trusted a validly bound requestState as proof that a human approved a destructive action, so a client could run dispatch-gated destructive tools after the human declined, cancelled, or never answered the confirmation prompt. This defeats the human-in-the-loop control that many organizations rely on to keep agents from deleting or overwriting data. It is limited to Streamable HTTP deployments with auth.jwtSecret set (versions 1.13.0 to before 1.31.4), and the caller still needs ordinary tool permissions. There is no KEV listing, public exploit, or EPSS score yet, and the package has no tracked dependents, so exposure is likely narrow but worth checking for anyone running agent-managed knowledge bases. Upgrade to 1.31.4 and treat client-side elicitation as advisory, not a security boundary: the fix cannot stop a malicious client from reporting a fabricated approval, so keep backups and restrict destructive scopes.

Is CVE-2026-115477 actively exploited?

No confirmed active exploitation of CVE-2026-115477 has been reported, but organizations should still patch proactively.

How to fix CVE-2026-115477?

1) Upgrade obsidian-tc to 1.31.4 or later. 2) Until patched, remove destructive scopes from agent and client credentials, or switch to stdio or a deployment without jwtSecret that uses the elicit_token fallback. 3) Take versioned backups or snapshots of Obsidian vaults (git or filesystem snapshots) so destructive operations can be rolled back. 4) Audit server logs for destructive tool calls that lack a matching elicitation/create response with an accept action. 5) Apply least privilege to JWT scopes and restrict network access to the MCP endpoint. 6) Do not rely on client-reported approval for high-impact actions; add an out-of-band approval or server-side policy where possible.

What systems are affected by CVE-2026-115477?

This vulnerability affects the following AI/ML architecture patterns: agent frameworks, MCP servers, human-in-the-loop approval workflows, knowledge base / note-taking integrations.

What is the CVSS score for CVE-2026-115477?

No CVSS score has been assigned yet.

What is the AI security impact?

Affected AI Architectures

agent frameworksMCP servershuman-in-the-loop approval workflowsknowledge base / note-taking integrations

MITRE ATLAS Techniques

AML.T0049Exploit Public-Facing Application
AML.T0053AI Agent Tool Invocation
AML.T0101Data Destruction via AI Agent Tool Invocation

Compliance Controls Affected

EU AI Act: Article 14
ISO 42001: A.9.2
NIST AI RMF: GOVERN 1.3
OWASP LLM Top 10: LLM06

What are the technical details?

Original Advisory

obsidian-tc is a governed, agent-ready Model Context Protocol server for Obsidian vaults. From 1.13.0 until 1.31.4, on a Streamable HTTP deployment with `auth.jwtSecret` configured and a 2026-07-28-era client declaring `elicitation.form` support, a dispatch-gated tool call offered an `inputRequired` confirmation could still complete after the human declined or cancelled, or the elicitation response was omitted or malformed, provided the client echoed the validly bound `requestState` on resubmission. The server trusted an authentic, call-bound state as proof of approval even though that state was minted before the `elicitation/create` leg was asked and proved only that the resubmission belonged to the same call. A client behaving incorrectly or under an attacker's control could therefore execute dispatch-gated destructive vault operations without the human's approval, while still requiring the caller's ordinary tool permissions. Only tools marked `destructive: true` or requiring a scope with a human-in-the-loop floor were reachable through this bypass. The sixteen handler-side conditionally gated tools, including `write_note` overwrite and `move_note`, did not read elicitation state on the modern wire and let neither approval nor decline through that path. Affected deployments using stdio or leaving `auth.jwtSecret` unset instead used the CLI `elicit_token` fallback and did not offer this `requestState` round trip. The fix does not prevent a malicious client from reporting a fabricated approval, because the server cannot verify that the client displayed the form or that a human saw it. This issue is fixed in version 1.31.4.

Exploitation Scenario

An attacker controls, or has tampered with, an MCP client or agent harness that talks to a shared obsidian-tc server over Streamable HTTP. The client calls a destructive tool, receives the inputRequired response with a bound requestState, and then resubmits with the state, either without showing the confirmation form or after the user declines. The server treats the authentic state as proof of approval and runs the destructive operation. The attacker can also combine this with a prompt injection that steers an agent into a destructive tool call, since the human decline no longer blocks execution. The result is deletion or corruption of notes in the vault without the required human consent.

Weaknesses (CWE)

CWE-285 — Improper Authorization: The product does not perform or incorrectly performs an authorization check when an actor attempts to access a resource or perform an action.

  • [Architecture and Design] Divide the product into anonymous, normal, privileged, and administrative areas. Reduce the attack surface by carefully mapping roles with data and functionality. Use role-based access control (RBAC) to enforce the roles at the appropriate boundaries. Note that this approach may not protect against horizontal authorization, i.e., it will not protect a user from attacking others with the same role.
  • [Architecture and Design] Ensure that you perform access control checks related to your business logic. These checks may be different than the access control checks that you apply to more generic resources such as files, connections, processes, memory, and database records. For example, a database may restrict access for medical records to a specific database user, but each record might only be intended to be accessible to the patient and the patient's doctor.

Source: MITRE CWE corpus.

Timeline

Published
October 23, 2026
Last Modified
October 29, 2026
First Seen
October 23, 2026

Related Vulnerabilities