Open WebUI feedback mass-assignment boundary¶
Signal: The 2026-05-15 06:15 UTC advisory scan surfaced a medium-severity Open WebUI evaluation feedback flaw where authenticated users could submit server-owned fields through a permissive form model and rewrite attribution for feedback records.
What changed¶
- Open WebUI feedback
user_idspoofing and evaluation data manipulation — GHSA-rjmp-vjf2-qf4g / CVE-2026-45396:open-webui < 0.9.5, fixed in0.9.5, accepted arbitrary extra fields inFeedbackFormand mergedform_data.model_dump()after server-derived fields in feedback creation. Because later duplicate keys win in Python dict literals, a low-privilege authenticated user could supplyuser_id,id, orversionand create feedback attributed to another user.
Boundary lesson¶
Mass assignment is not only a Rails-era controller problem. Any request schema that preserves unknown fields becomes dangerous when those fields are later splatted or merged into persistence models. Server-owned identity, authorization, versioning, ownership, timestamps, and primary-key fields should be assigned after untrusted form data—or, better, never share a generic merge path with form data at all.
For model-evaluation systems, this becomes an integrity boundary: user feedback and Elo-style ranking inputs are security-relevant data because they can influence model routing, procurement decisions, benchmarks, or trust dashboards. Treat evaluation telemetry as authenticated, attributable audit data rather than harmless product analytics.
Defender checklist¶
- Upgrade Open WebUI to
0.9.5+anywhere evaluation feedback endpoints are exposed. - Search application logs for authenticated
POST /api/v1/evaluations/feedbackbodies containing unexpected top-level fields such asuser_id,id, orversion. - Rebuild or quarantine evaluation leaderboards if low-privilege users could have submitted feedback before patching; do not rely on historical Elo scores without checking attribution integrity.
- In code review, flag Pydantic models using
extra='allow'when theirmodel_dump()output flows into ORM constructors, dict merges, or update statements. - For every create/update path, assign server-controlled identity and ownership fields explicitly after untrusted data, or use allowlisted field mapping instead of
**form_data.model_dump().