Open WebUI CVE-2026-44566
HIGHSeverity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L
Endpoint requires an authenticated session (get_current_user, JWT in PoC) so PR:L; unsanitized arbitrary file write enables RCE via pickle/authorized_keys, yielding high C/I/A.
Primary rating from GitHub Advisory.
CVSS VectorGitHub Advisory
Lifecycle Timeline
3DescriptionGitHub Advisory
CONFIDENTIAL
KL-CAN-2024-002
Vulnerability Details
| Field | Value |
|
|---|-------|-------| | 1 | Discoverer | Jaggar Henry & Sean Segreti of KoreLogic, Inc. | | 2 | Date Submitted | 2024.03.12 | | 3 | Title | Open WebUI Arbitrary File Upload + Path Traversal | | 5 | Affected Vendor | Open WebUI | | 6 | Affected Product(s) | Open WebUI (Formerly Ollama WebUI) | | 7 | Affected Version(s) | 0.1.105 | | 8 | Platform/OS | Debian GNU/Linux 12 (bookworm) | | 9 | Vector | HTTP web interface | | 10 | CWE | CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal'), CWE-434: Unrestricted Upload of File with Dangerous Type | ---
4. High-level Summary
Attacker controlled files can be uploaded to arbitrary locations on the web server's filesystem by abusing a path traversal vulnerability.
---
11. Technical Analysis
When attaching files to a prompt by clicking the plus sign (+) on the left of the message input box when using the Open WebUI HTTP interface, the file is uploaded to a static upload directory.
The name of the file is derived from the original HTTP upload request and is not validated or sanitized. This allows for users to upload files with names containing dot-segments in the file path and traverse out of the intended uploads directory. Effectively, users can upload files anywhere on the filesystem the user running the web server has permission.
This can be visualized by examining the python code for the /rag/api/v1/doc API route:
@app.post("/doc")
def store_doc(
collection_name: Optional[str] = Form(None),
file: UploadFile = File(...),
user=Depends(get_current_user),
):
# "https://www.gutenberg.org/files/1727/1727-h/1727-h.htm"
print(file.content_type)
try:
filename = file.filename
file_path = f"{UPLOAD_DIR}/{filename}"
contents = file.file.read()
with open(file_path, "wb") as f:
f.write(contents)
f.close()The file variable is a representation of the multipart form data contained within the HTTP POST request. The filename variable is derived from the uploaded file name and is not validated before writing the file contents to disk.
This can be used to upload malicious models. These models are often distributed as pickled python objects and can be leveraged to execute arbitrary python bytecode once deserialized. Alternatively, an attacker can leverage existing services, such as SSH, to upload an attacker controlled authorized_keys file to remotely connect to the machine.
---
12. Proof-of-Concept
Execute the following cURL command:
TARGET_URI='https://redacted.com'; JWT='redacted'; LOCAL_FILE='/tmp/file_to_upload.txt'\
curl -H "Authorization: Bearer $JWT" -F "file=$LOCAL_FILE;filename=../../../../../../../../../../tmp/pwned.txt" "$TARGET_URI/rag/api/v1/doc"Verify the file pwned.txt exists in the /tmp/ directory on the machine hosting the web server:
ollama@webserver:~$ cat /tmp/pwned.txt
korelogic
ollama@webserver:~$AnalysisAI
Arbitrary file write in Open WebUI (formerly Ollama WebUI) 0.1.105 through 0.1.123 lets a user of the chat interface abuse the /rag/api/v1/doc document-upload endpoint to plant attacker-controlled files anywhere the web server process can write. Because the uploaded filename is used verbatim to build the destination path, dot-segment traversal (../../) escapes the uploads directory, enabling code execution by dropping a malicious pickled model or an SSH authorized_keys file. Publicly available exploit code exists (a working cURL PoC is published in the KoreLogic/GHSA advisory), but there is no confirmed active exploitation; EPSS is low at 0.06% (17th percentile).
Technical ContextAI
Open WebUI is a Python (FastAPI) web front-end for large-language-model backends such as Ollama, distributed via the pip package open-webui. The flaw is a classic CWE-22 path traversal combined with CWE-434 unrestricted file upload: the store_doc() handler for the /rag/api/v1/doc route reads file.filename directly from the multipart request and interpolates it into f"{UPLOAD_DIR}/{filename}" with no sanitization, normalization, or containment check before open(file_path, 'wb'). Supplying a filename like ../../../../tmp/pwned.txt causes the write to land outside UPLOAD_DIR. The impact is amplified by the ML deployment context - model files are frequently Python pickles that execute arbitrary bytecode on deserialization - so an attacker-planted 'model' can turn a file write into remote code execution.
RemediationAI
Vendor-released patch: 0.1.124 - upgrade Open WebUI to 0.1.124 or later (all versions up to and including 0.1.123 are affected), following GHSA-9pgh-j74g-qj6m at https://github.com/open-webui/open-webui/security/advisories/GHSA-9pgh-j74g-qj6m. Where immediate upgrade is not possible, restrict network exposure of the interface (place it behind authentication and a reverse proxy, and do not expose /rag/api/v1/doc to untrusted networks), and run the service as a low-privilege, sandboxed account whose write permissions are confined to the intended uploads directory (for example via a read-only root filesystem or container with a single writable volume) so traversal cannot reach sensitive paths like SSH authorized_keys or system binaries - the trade-off is that document-upload/RAG ingestion features may break if the account is over-constrained. Avoid loading untrusted model/pickle files, and monitor the uploads directory and home directories for unexpected file writes as a detection control.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
Same weakness CWE-22 – Path Traversal
View allSame technique Path Traversal
View allShare
External POC / Exploit Code
Leaving vuln.today
GHSA-9pgh-j74g-qj6m