OPEN-WEBUI · CVE-2026-109293 · AI agents & MCP
FIX → 0.11.4
Open WebUI's tool export endpoint returned the full Python source of every tool shared read-only with a non-admin user, including any embedded API keys or credentials. An authenticated non-admin with tool export permission can read that source, but cannot modify or run the tools.
first public Sep 27, 2026 · 2 sources
Could this affect your app?
Free first check from your website. Connect your repo for the full answer.
Only self-hosted Open WebUI deployments on 0.11.0 through 0.11.3 where non-admin users have tool export rights and some tools are shared read-only with them. Deployments that never grant tool export to non-admins, or that share tools only with users who already have write access, are not affected. Upgrading to 0.11.4 resolves it with no configuration change.
Not affected if managed-hosting, no-read-only-tool-shares, tools-export-admin-only
Who cares open-webui, python, self-hosted
pip show open-webui and confirm whether it is between 0.11.0 and 0.11.3.workspace.tools_export permission, set by USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT or in default or group permissions.A user allowed to export tools received the full Python source of every tool that had merely been shared with them for reading. Since 0.11.0 tool source is writer-only: a read-only recipient can use a shared tool, and the tool's detail view withholds its source from them. The bulk export returned it anyway, because it selected every tool the caller could read.
WEBUI_AUTH=true, default) and plugins enabled (ENABLE_PLUGINS=true, default).workspace.tools_export, off by default, set with USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT or granted by an admin in default or group permissions).Deployments that never grant the tool export permission to non-admins, or that share tools only with users who already hold write access, are not affected.
A non-admin with export rights obtains the server-side source of every tool shared with them read-only, in one request. Tool source commonly embeds API keys, credentials and internal service URLs, so the loss often reaches beyond the code itself. Confidentiality only: the export grants no ability to modify or run tools, and has no integrity or availability impact.
Check it with your coding agent
It reads this page and tells you if your code is affected.
Are you affected?
Ask from here. InfraStack checks the affected versions against your stack and answers in your inbox.
InfraStack checks the affected versions against your stack and answers in Slack, with the evidence and the fix.
Upgrade to 0.11.4
open-webui 0.11.4 (fixed version per the product data)Fixed in 0.11.4 by #29310. The export now returns only tools the caller owns or holds write access to, the same scope the per-tool export and the model export already used. Upgrading fully resolves the issue with no configuration change.
Affected component: GET /api/v1/tools/export in backend/open_webui/routers/tools.py. Affected setup: releases 0.11.0 through 0.11.3. Tool export has been open to non-admins since 0.6.37, but before 0.11.0 a read-only recipient could already read a shared tool's source in its detail view, so the export disclosed nothing beyond that.
The export response deliberately includes each tool's source, since exporting is how a writer takes a copy of their tools. The handler, however, built its list with the default read scope of the tool query, so every tool shared read-only with the caller was exported with its source. When 0.11.0 made source writer-only on the detail endpoint, the export path was left on the read scope and kept returning it.
Against a fresh instance, with an admin and a second account bob of role user:
POST /api/v1/users/default/permissions with workspace.tools_export: true).POST /api/v1/tools/create
{"id": "readtool", "name": "Read Tool",
"content": "API_KEY = \"TOOL_SRC_SECRET\"\nclass Tools:\n def hello(self) -> str:\n return 'hi'\n",
"meta": {"description": "poc"},
"access_grants": [{"principal_type": "user", "principal_id": "<bob id>", "permission": "read"}]}
GET /api/v1/tools/id/readtool -> 200, no content field
GET /api/v1/tools/export -> 200, [{"id": "readtool", "content": "API_KEY = \"TOOL_SRC_SECRET\" ...", ...}]
On 0.11.4 the same export returns only tools bob owns or can write, and readtool is absent, while the admin still exports it.
This page as .md · .json · CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
NVD data is provided by NIST and is public domain. Posts quoted belong to their authors.