Folder creation endpoint and form model:
- backend/open_webui/models/folders.py (lines 72-77, FolderForm with extra='allow')
- backend/open_webui/models/folders.py (lines 95-106, insert_new_folder dict construction)
- backend/open_webui/routers/folders.py (line 119, create_folder endpoint)
Current main branch (commit 6fdd19bf1) and likely all versions since FolderForm adopted extra='allow'.
FolderForm uses model_config = ConfigDict(extra='allow'), which permits arbitrary fields to pass through Pydantic validation and be included in model_dump(exclude_unset=True). In insert_new_folder, the server-assigned user_id is placed at the start of the dict and then overwritten by the spread of form data:
# models/folders.py:95-106
folder = FolderModel(
**{
'id': id, # server
'user_id': user_id, # server — overwritten below
**(form_data.model_dump(exclude_unset=True) or {}), # user-controlled (extra='allow')
'parent_id': parent_id,
'created_at': int(time.time()),
'updated_at': int(time.time()),
}
)
Because FolderModel declares user_id: str as a real field (not just a form extra), any attacker-supplied user_id in the POST body is accepted by the model and persisted on the Folder row.
GET /api/v1/users/search, intentionally accessible to verified users for sharing UI), shared chat metadata, or channel member lists.POST /api/v1/folders/
{
"name": "Important: Click here",
"user_id": "<victim_user_id>",
"meta": {"icon": "warning"},
"data": {...}
}
user_id field (allowed by extra='allow').insert_new_folder spreads the form data over the server-set 'user_id': user_id, overwriting it with the attacker's value.Folder row is persisted with user_id = <victim_user_id>.GET /api/v1/folders/ filters by the viewer's own user_id.The attacker can repeat this to plant multiple folders, use crafted name values for phishing ("Click here to recover account" / "Security alert"), and abuse the meta and data fields to add visual elements that further mimic legitimate content.
name, meta, and data render in the victim's UI in a trusted contextuser_id — so confidentiality is preserved, but integrity and trust are compromisedfeatures.folders permission (default for all users){
"github_reviewed": true,
"github_reviewed_at": "2026-05-08T19:38:54Z",
"cwe_ids": [
"CWE-862"
],
"severity": "MODERATE",
"nvd_published_at": null
}