Sep 10, 2026·7 min read·16 visits
Eleven of fifteen vector database backends in Open WebUI ignored query filters, allowing authenticated users to enumerate metadata of unauthorized knowledge bases.
A Broken Object-Level Authorization (BOLA) vulnerability exists in Open WebUI starting from version 0.7.0 up to (but not including) 0.11.1. The flaw resides in the platform's built-in knowledge search tool, which constructs metadata filters to scope database queries based on user permissions. However, eleven of the fifteen shipped vector database backends accepted these filters but silently ignored them, enabling authenticated users to retrieve and enumerate the metadata of inaccessible or private knowledge bases.
Open WebUI is an extensible self-hosted artificial intelligence platform. The platform implements a built-in knowledge search tool to retrieve document context and ground language model interactions. Users can define private or shared knowledge bases containing documents, which are subsequently indexed in a vector database backend.
The platform provides integration with fifteen distinct vector database backends. When a user queries the system, the application is designed to identify the knowledge bases that the specific user is authorized to read. It then generates a metadata filter specifying those authorized identifiers, passing the filter constraint to the active vector database wrapper to isolate the search space.
In versions 0.7.0 through 0.11.0, eleven of the fifteen supported vector backends received the authorization filter parameter but failed to apply it during database query generation. This design inconsistency resulted in a broken object-level authorization (BOLA) vulnerability. Consequently, search queries executed by authenticated low-privilege users could match against and expose records from unshared or restricted collections.
The root cause of this vulnerability lies in an architectural misalignment within the vector client adapters. The abstract base class VectorDBBase specifies filter: Optional[dict] = None in its standard search method signature. However, the concrete class implementations for eleven vector database clients failed to implement translation or passing of this parameter to their respective backend search engines.
When a query is dispatched, the database wrapper is responsible for converting the generic dictionary filter structure into the native query syntax of the target vector store. Because the wrapper implementations silently dropped the filter parameter, the resulting database query did not contain any metadata constraints. The database engine executed a global search across the index, returning matched vectors regardless of their original knowledge base ownership.
The exposure is primarily limited to metadata associated with the matched vector points. This metadata typically includes the unique identifiers, names, and descriptions of the knowledge bases. Although the primary text contents of the documents are stored in separate collections, the leaked metadata exposes sensitive organizational taxonomies, file structures, and descriptive summaries to unauthorized authenticated users.
An examination of the vulnerable and patched code reveals the omission of the filter parsing logic. In the Elasticsearch backend (elasticsearch.py) before the patch, the search method hardcoded the query to filter solely on the static collection name. The incoming filter argument was completely unused during query construction.
# Vulnerable Elasticsearch Query Construction
query = {
'size': limit,
'_source': ['text', 'metadata'],
'query': {
'script_score': {
'query': {'bool': {'filter': [{'term': {'collection': collection_name}}]}},
'script': {
'source': "cosineSimilarity(params.vector, 'vector') + 1.0",
...
}
}
}
}The remediation introduces a helper function _metadata_filter to map operations such as $in into Elasticsearch terms queries, and dynamically appends these conditions to the filter array.
# Patched Elasticsearch Query Construction
def _metadata_filter(key: str, op: str, value: Any) -> dict:
if op == '$in':
return {'terms': {f'metadata.{key}': value}}
return {'term': {f'metadata.{key}': value}}
# Inside the patched search() method
filters = [{'term': {'collection': collection_name}}]
if filter:
filters.extend(_metadata_filter(key, op, value) for key, op, value in iter_filter_conditions(filter))
query = {
'size': limit,
'_source': ['text', 'metadata'],
'query': {
'script_score': {
'query': {'bool': {'filter': filters}},
...
}
}
}Similarly, the Qdrant backend implementation was updated to translate generic metadata constraints into formal Qdrant FieldCondition models. The patch maps standard filtering operators to either MatchAny or MatchValue conditions, ensuring the query includes a defined query_filter attribute.
# Patched Qdrant Filter Construction
def _metadata_filter(key: str, op: str, value: Any) -> models.FieldCondition:
match = models.MatchAny(any=value) if op == '$in' else models.MatchValue(value=value)
return models.FieldCondition(key=f'metadata.{key}', match=match)
# Applying filter in search()
conditions = [_metadata_filter(key, op, value) for key, op, value in iter_filter_conditions(filter)]
query_filter = models.Filter(must=conditions) if conditions else NoneThe exploitation of this vulnerability does not require complex payloads or high privileges. An attacker must first authenticate to the target Open WebUI instance with a standard user account. The vulnerability is triggered when the attacker submits a query that forces the platform to execute a knowledge search, or when they interact directly with backend API endpoints responsible for knowledge retrieval.
When the query is initiated, the platform backend correctly calculates the attacker's authorization scope, producing a metadata filter containing only the knowledge bases they are allowed to read. However, because the active vector client wrapper (such as Milvus or Qdrant) silently discards the filter parameter, the query executes globally.
The vector database processes the semantic similarity of the query against all stored vectors, including those belonging to other users' private knowledge bases. The database returns the closest matches along with their metadata. The application then propagates these results back, presenting the attacker with the titles, descriptions, and IDs of unauthorized knowledge bases.
A representation of this flow is shown in the sequence below:
The primary security impact of CVE-2026-87017 is the unauthorized exposure of sensitive metadata. This includes knowledge base identifiers, names, and descriptions belonging to other users or administrators. In many enterprise settings, knowledge base names and descriptions contain confidential information such as project names, internal server names, or proprietary product details.
The vulnerability has been assigned a CVSS score of 4.3 (Medium) with the vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N. The impact is restricted to confidentiality, with no integrity or availability implications. The exploitability is low because the attack requires authenticated access, but the execution complexity is low since the application logic bypasses the security boundary automatically.
While the document body text itself is typically stored in separate collections, the exposure of metadata acts as a valuable reconnaissance tool. An attacker can map the structure of an organization's knowledge store, identifying target repositories or project frameworks for subsequent attacks or social engineering campaigns.
The primary and most effective remediation step is upgrading the Open WebUI installation to version 0.11.1 or higher. The developers have successfully refactored the vector database adapters to properly map, validate, and apply metadata filters to prevent global index queries.
If an immediate upgrade is not feasible, several defensive mitigation strategies can be applied. Administrators can disable the built-in knowledge search tool globally or restrict its use to trusted roles via the admin configuration panel. This restricts the vector database query path from being triggered by arbitrary users.
Alternatively, administrators can switch the active vector database backend to Chroma. The Chroma backend adapter correctly implemented and applied metadata filters in older versions and was not affected by this vulnerability. Another alternative is physical segmentation, where sensitive knowledge bases are deployed to separate, isolated vector store instances.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Open WebUI open-webui | >= 0.7.0, < 0.11.1 | 0.11.1 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-863 |
| Attack Vector | Network (AV:N) |
| CVSS v3.1 Score | 4.3 (Medium) |
| Exploit Status | Proof-of-Concept (PoC) / Known Root Cause |
| KEV Status | Not Listed |
| Affected Components | Vector database client adapters |
The software performs an authorization check when an actor attempts to access a resource or perform an action, but it does not correctly perform the check, allowing attackers to bypass intended security policies.
CVE-2026-115895 is a high-severity code injection vulnerability (CWE-94) in the happy-dom npm package prior to version 21.0.4. The vulnerability exists within the ECMAScriptModuleCompiler component, which transforms ECMAScript module syntax into executable Node.js functions when JavaScript evaluation is enabled. Due to an incomplete fix for CVE-2026-33943, the compiler failed to validate local named import aliases against legal JavaScript identifier rules. Attackers supplying crafted module imports—specifically utilizing destructuring default initializers alongside JSON module attributes—can inject arbitrary JavaScript expressions directly into the host Node.js runtime context.
An improper input validation and authorization bypass vulnerability exists in the LangGraph storage layer affecting langgraph, langgraph-checkpoint-postgres, and langgraph-checkpoint-sqlite. Because relational store implementations serialize namespace tuples into dot-delimited strings without validating labels on read, search, delete, and batch operations, an attacker who controls a namespace label can inject periods (.) to traverse namespace boundaries and access, modify, or delete data belonging to other namespaces.
CVE-2026-115886 (GHSA-2wqp-q3c6-ccj5) is a Server-Side Request Forgery (SSRF) and Unsafe Reflection vulnerability in MLflow versions 3.12.0rc0 prior to 3.17.0. Unauthenticated REST API endpoints accept serialized third-party scorer JSON payloads that are dynamically deserialized and reflectively instantiated without sanitizing constructor keyword arguments. When optional dependencies such as trulens and trulens-providers-litellm are installed, attackers can inject egress-steering arguments into the scorer payload, forcing the MLflow server to dispatch outbound HTTP requests to arbitrary internal destinations or cloud metadata services.
CVE-2026-113872 (GHSA-q7qp-rjg7-q26m) is a high-severity denial-of-service vulnerability affecting the multer multipart/form-data upload middleware for Node.js and Express in versions 2.0.0 through 2.4.0. When an endpoint is configured to accept multiple files using an asynchronous fileFilter callback, a crafted, truncated multipart HTTP request can trigger an unhandled error event on the underlying busboy stream parser after request teardown has already completed. Because all error listeners are stripped during teardown, Node.js treats the resulting error event as an uncaught exception and immediately terminates the server process.
CVE-2026-115897 (also tracked as GHSA-m5mm-p8h7-m29v and aliased as CVE-2026-115754) is a Cross-Site Scripting (XSS) vulnerability in the Yahoo serialize-javascript npm package prior to version 7.1.3. The flaw exists in the regular expression used by escapeFunctionBody() to neutralize HTML script closing tags within serialized JavaScript functions. Because function bodies are sanitized in isolation before structural formatting is applied, a function whose string representation terminates directly with the sequence '</script' bypasses the positive lookahead check. When combined with serialization formatting options that introduce whitespace delimiters and a subsequent property that supplies a closing bracket, an attacker can prematurely terminate an enclosing HTML <script> block and inject arbitrary HTML or JavaScript into the rendered document.
CVE-2026-109841 is a Subresource Integrity (SRI) verification bypass vulnerability in undici, the official HTTP/1.1 and HTTP/2 client library for Node.js that powers the global fetch() implementation. The flaw stems from improper handling of case sensitivity (CWE-178) when validating cryptographic hash algorithm tokens within SRI metadata. Because undici compared incoming algorithm identifiers against a strictly lowercase set without prior ASCII-lowercase normalization, valid uppercase or mixed-case tokens such as SHA256- or Sha384- were treated as unrecognized algorithms and discarded. Under SRI forward-compatibility rules, discarding all provided tokens results in an empty integrity list, causing undici to fail open and accept tampered HTTP response bodies without cryptographic verification.