CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-6GQW-JQV7-V88M

GHSA-6GQW-JQV7-V88M: Multi-Tenant Isolation Bypass in stigmem-node via Missing SQL Tenant Predicates

Amit Schendel
Amit Schendel
Senior Security Researcher

Jun 22, 2026·6 min read·3 visits

Executive Summary (TL;DR)

A multi-tenant isolation bypass in stigmem-node allows authenticated users of one tenant to read, modify, and delete data belonging to all other tenants due to a lack of SQL tenant_id filters in the decay, quarantine, and tombstone systems.

A critical vulnerability exists in the stigmem-node package when running the opt-in stigmem-plugin-multi-tenant plugin. Due to a failure to enforce tenant-scoping filters on database queries within the decay sweep, quarantine moderation, and right-to-be-forgotten (RTBF) subsystems, an authorized caller belonging to one tenant can access, modify, and delete facts belonging to all other tenants. This broken object level authorization (BOLA) vulnerability allows cross-tenant data manipulation and information leakage.

Vulnerability Overview

The application stigmem-node supports multi-tenant deployments via the stigmem-plugin-multi-tenant plugin. This plugin implements logical data separation by assigning a tenant_id to each record in a shared relational database. Multi-tenant isolation models rely on database queries systematically filtering records according to the authenticated caller's tenant identifier.

Three subsystems within the core codebase fail to apply the required tenant_id restrictions: decay sweeps (lifecycle/decay.py), quarantine moderation (routes/quarantine.py), and Right-to-Be-Forgotten (RTBF) tombstones (lifecycle/tombstones.py). This structural omission exposes an attack surface where any caller with write access to a single tenant can read, modify, or erase data across all other tenant partitions.

The vulnerability is classified under CWE-863 (Incorrect Authorization) and CWE-284 (Improper Access Control). The security impact represents a complete compromise of tenant integrity and availability, as a low-privileged tenant user can trigger global data expiration and control moderation flows belonging to other organizations on the same node.

Root Cause Analysis

The root cause of this vulnerability lies in the shared-schema multi-tenancy implementation used by stigmem-node. All tenant data resides within the same SQLite tables, utilizing a tenant_id column to distinguish between records owned by different tenants. To maintain strict isolation boundaries, every data manipulation and selection query must execute with a static or dynamic predicate specifying tenant_id = ?.

In the vulnerable version of stigmem-node, the decay sweep worker fetches expired facts by querying the database using timestamp values without appending a tenant_id check. Because the SQL statements query the global facts table without isolation constraints, candidate selection matches facts from every tenant in the system. When the background job executes, it applies expiration overrides globally.

Similarly, the quarantine moderation route resolves fact lookups by targeting only the fact_id, ignoring the caller's active tenant identifier. Lastly, the RTBF system retrieves active tombstones based strictly on entity URIs. This omission permits tombstones registered by Tenant B to be parsed and applied during Tenant A's read path, enabling unauthorized, cross-tenant data suppression.

Code-Level Vulnerability & Patch Analysis

In node/src/stigmem_node/lifecycle/decay.py, the candidate-selection SQL queries were executed without a tenant_id constraint, leading to a global table scan.

# BEFORE PATCH (Vulnerable)
def _select_ttl_candidates(
    conn: Any, effective_ttl: int, scope: str | None, now_dt: datetime
) -> list[str]:
    cutoff = (now_dt - timedelta(seconds=effective_ttl)).isoformat()
    sql = (
        "SELECT f.id FROM facts f "
        "LEFT JOIN fact_validity_overrides fvo ON fvo.fact_id = f.id "
        "WHERE f.timestamp <= ? "
        "AND COALESCE(fvo.valid_until, f.valid_until) IS NULL "
        "AND NOT (entity LIKE 'stigmem:%' AND entity NOT LIKE 'stigmem://%') "
        "AND NOT (relation LIKE 'stigmem:%' AND relation NOT LIKE 'stigmem://%')"
    )
    params: list[Any] = [cutoff]

The patched code introduces a strict tenant_id parameter to the function signatures, appends AND f.tenant_id = ? to the SQL query, and binds the caller's active tenant identifier to the query parameters.

# AFTER PATCH (Fixed)
def _select_ttl_candidates(
    conn: Any, effective_ttl: int, scope: str | None, now_dt: datetime, tenant_id: str
) -> list[str]:
    cutoff = (now_dt - timedelta(seconds=effective_ttl)).isoformat()
    sql = (
        "SELECT f.id FROM facts f "
        "LEFT JOIN fact_validity_overrides fvo ON fvo.fact_id = f.id "
        "WHERE f.timestamp <= ? "
        "AND f.tenant_id = ? "  # Added tenant-scoping predicate
        "AND COALESCE(fvo.valid_until, f.valid_until) IS NULL "
        "AND NOT (entity LIKE 'stigmem:%' AND entity NOT LIKE 'stigmem://%') "
        "AND NOT (relation LIKE 'stigmem:%' AND relation NOT LIKE 'stigmem://%')"
    )
    params: list[Any] = [cutoff, tenant_id]

This same modification pattern was applied to _select_confidence_candidates in decay.py, _get_quarantined_fact in routes/quarantine.py, and _get_tombstone_filter in routes/facts/common.py. The remediation effectively binds all database filters to the verified session of the active caller, preventing cross-tenant leakage at the SQL layer. This fix is structurally complete, though long-term security depends on developers maintaining these predicates in future SQL queries.

Exploitation Methodology

An attacker can exploit this vulnerability with standard, low-privileged write credentials for an authorized tenant (e.g., Tenant B). The objective is to retrieve metadata and destroy active records within Tenant A (commonly running on the default workspace).

First, the attacker uses the decay sweep endpoint to execute a reconnaissance query. By sending an HTTP POST request to /v1/decay/sweep with the parameter dry_run set to true, the attacker forces the system to perform a global database scan. Because the SQL query lacks isolation predicates, the response returns the count of all facts stored across the entire multi-tenant server, confirming the volume of Tenant A's data.

POST /v1/decay/sweep HTTP/1.1
Host: vulnerable-node.stigmem.internal
Authorization: Bearer <Tenant-B-Write-Token>
Content-Type: application/json
 
{
  "ttl_seconds": 0,
  "dry_run": true
}

Second, the attacker weaponizes the sweep by repeating the request with dry_run set to false. The application backend fetches all records older than zero seconds across all tenants, and writes an override setting valid_until to now() for each matched fact ID. Consequently, Tenant A's active database contents are immediately flagged as expired and purged from active queries, executing a cross-tenant denial of service.

Impact Assessment & Risk Vector

The successful exploitation of GHSA-6GQW-JQV7-V88M leads to a high-impact breach of data integrity and availability, alongside low-impact confidentiality exposure. The CVSS v4.0 score is rated at 7.2 with the vector CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:H/VA:H/SC:N/SI:N/SA:N.

The high rating for Integrity (VI:H) stems from the attacker's capability to modify other tenants' data states. By abusing the missing tenant filter in the quarantine route, a malicious tenant administrator can unilaterally approve or reject quarantined data belonging to other organizations, disrupting the ingestion workflows.

The high rating for Availability (VA:H) is driven by the potential for permanent or temporary data destruction via the decay sweep. An attacker can set arbitrary expiration constraints globally, forcing data to disappear from legitimate user queries. Confidentiality exposure remains low (VC:L) because raw data records are not fully dumped through the sweep endpoints, though record counts are directly leaked.

Remediation & Defensive Guidance

To remediate GHSA-6GQW-JQV7-V88M, systems administrators must upgrade the stigmem-node package to version 0.9.0a12 or newer. This version enforces standard tenant-parameter binding on all dynamic database selections. Organizations using the package in a single-tenant layout are not actively exposed but should upgrade to maintain robust code hygiene.

If upgrading immediately is not possible, administrators should disable the multi-tenant plugin by updating the configuration file or environment variables to set STIGMEM_MULTI_TENANT_ENABLED="false". Disabling multi-tenancy restricts the application context to a single default namespace, nullifying cross-tenant traversal vectors.

Web Application Firewalls (WAF) can be configured to block ad-hoc POST requests to /v1/decay/sweep and /v1/quarantine endpoints originating from untrusted tenants. Additionally, monitoring logs should flag any invocation of decay sweeps that occur outside scheduled maintenance windows or are initiated by non-administrative users.

Official Patches

eidetic-labsPR #728: Scopes database queries to caller's tenant

Technical Appendix

CVSS Score
7.2/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:H/VA:H/SC:N/SI:N/SA:N

Affected Systems

stigmem-node running stigmem-plugin-multi-tenant

Affected Versions Detail

Product
Affected Versions
Fixed Version
stigmem-node
eidetic-labs
< 0.9.0a120.9.0a12
AttributeDetail
CWE IDCWE-863 (Incorrect Authorization)
Attack VectorNetwork (AV:N)
CVSS v4.0 Score7.2 (High)
ImpactHigh (Integrity and Availability Compromise)
Exploit StatusProof-of-Concept
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1565.001Stored Data Manipulation
Impact
T1083File and Directory Discovery
Discovery
CWE-863
Incorrect Authorization

The software performs an authorization check when an actor attempts to access a resource, but it does not correctly verify that the actor is authorized to access that resource.

Known Exploits & Detection

GitHub AdvisoryOfficial GHSA advisory details with reproduction concepts.

Vulnerability Timeline

Pull Request #728 is drafted and validated with regression testing.
2026-06-12
Security Advisory GHSA-6GQW-JQV7-V88M is published.
2026-06-19
Release of patched version 0.9.0a12.
2026-06-19

References & Sources

  • [1]GHSA-6GQW-JQV7-V88M Security Advisory
  • [2]Pull Request #728: Fix tenant-scoping in decay, quarantine, and tombstones

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 4 hours ago•GHSA-V3F4-W7R7-V3HM
8.6

GHSA-v3f4-w7r7-v3hm: Remote Command Execution via Origin Validation Error in Uni-CLI Legacy HTTP Transport

An origin validation error and cross-site request forgery vulnerability in @zenalexa/unicli prior to version 0.225.2 allows cross-origin web applications to execute arbitrary tools on a user's local machine via the legacy stateless HTTP transport.

Amit Schendel
Amit Schendel
3 views•7 min read
•about 5 hours ago•GHSA-C795-2G9C-J48M
8.2

GHSA-C795-2G9C-J48M: Remote Path Traversal and Arbitrary File Write in EverOS Memory Ingestion

EverOS versions 1.0.0 and earlier contain a path traversal vulnerability in the user memory ingestion endpoint. By exploiting this flaw, unauthenticated network attackers can escape the designated database memory root and write arbitrary Markdown files to target directories on the local system.

Alon Barad
Alon Barad
4 views•6 min read
•about 5 hours ago•GHSA-X975-RGX4-5FH4
8.2

GHSA-X975-RGX4-5FH4: Unescaped Locator Data Cross-Site Scripting in appium-mcp MCP-UI Resource

GHSA-X975-RGX4-5FH4 is a high-severity Cross-Site Scripting (XSS) vulnerability residing in the Model Context Protocol (MCP) User Interface (UI) component of appium-mcp, an NPM package integrating Appium with MCP clients. The flaw exists within the createLocatorGeneratorUI utility function, which renders UI metadata directly into an HTML template page without performing sanitization or encoding. Because MCP clients use window.parent.postMessage to send commands from the UI to the host, this XSS can be escalated to trigger arbitrary MCP tool calls, potentially leading to Remote Code Execution (RCE) on the host running the MCP client.

Alon Barad
Alon Barad
7 views•6 min read
•about 6 hours ago•GHSA-H3M5-97JQ-QJRF
9.6

GHSA-H3M5-97JQ-QJRF: Insecure Direct Object Reference (IDOR) Cross-Realm Bulk Alarm Deletion in OpenRemote Manager

An Insecure Direct Object Reference (IDOR) and missing authorization flaw in OpenRemote Manager allows an authenticated, low-privilege multi-tenant user to execute cross-realm bulk alarm deletion, resulting in permanent destruction of safety-critical alarms belonging to other tenants.

Amit Schendel
Amit Schendel
6 views•7 min read
•about 6 hours ago•GHSA-WVRH-2F4M-924V
5.5

GHSA-wvrh-2f4m-924v: Symlink-Following Arbitrary File Write in ChatterBot UbuntuCorpusTrainer

An insecure file extraction vulnerability exists in the UbuntuCorpusTrainer component of the ChatterBot package. Due to a combination of a predictable download path, a check-then-create directory pattern, and unvalidated symbolic link resolution during archive extraction, local attackers can write arbitrary files to restricted filesystem paths.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 7 hours ago•GHSA-CW6H-FFMH-X6VH
6.5

GHSA-CW6H-FFMH-X6VH: Arbitrary Local File Disclosure via Same-Origin Policy Bypass in Anki Desktop

Anki Desktop for Windows, macOS, and Linux is vulnerable to local file disclosure and data exfiltration due to an iframe-based Same-Origin Policy (SOP) bypass. Maliciously crafted user scripts inside imported deck files run within the localhost context, bypassing security filters to query internal endpoints and read arbitrary system files.

Alon Barad
Alon Barad
6 views•4 min read