CVE-2026-87012 Overview
CVE-2026-87012 affects Open WebUI, an extensible self-hosted AI platform. The vulnerability exists in backend/open_webui/models/calendar.py from version 0.9.0 through 0.11.0. An authenticated user with the calendar permission can store a non-numeric alert_minutes value in an event's meta field. The shared upcoming-event scheduler then performs a numeric comparison against that value, raising an exception. The exception aborts the instance-wide alert pass, suppressing reminders for all users while the malformed event remains in the lookahead window. The issue is classified under [CWE-754] (Improper Check for Unusual or Exceptional Conditions).
Critical Impact
A single authenticated user with the calendar permission can suppress calendar reminders across the entire Open WebUI instance for all users.
Affected Products
- Open WebUI versions 0.9.0 through 0.11.0
- Self-hosted Open WebUI deployments exposing calendar functionality
- Multi-tenant Open WebUI instances relying on the shared upcoming-event scheduler
Discovery Timeline
- 2026-09-09 - CVE-2026-87012 published to NVD
- 2026-09-09 - Last updated in NVD database
- Fix released in Open WebUI version 0.11.1
Technical Details for CVE-2026-87012
Vulnerability Analysis
Open WebUI stores calendar event metadata in a user-writable meta dictionary attached to each event. The alert_minutes field controls when the platform issues reminders before an event begins. The shared scheduler iterates over all upcoming events across the instance in a single pass and compares each event's alert_minutes against the current time window.
The vulnerable code retrieved alert_minutes directly from meta without validating its type. When a user submitted a string or other non-numeric value, the subsequent comparison operation raised a TypeError. Because the exception was not caught within the per-event loop, it propagated upward and terminated the entire scheduler pass. Every user's reminders were suppressed for the duration that the malformed event remained in the lookahead window.
Root Cause
The root cause is missing input type validation on user-controlled metadata combined with the absence of exception isolation around per-event processing. The scheduler treated a shared iteration as atomic instead of tolerating errors on individual entries.
Attack Vector
An authenticated attacker holding the calendar permission creates or edits a calendar event and sets meta.alert_minutes to a non-numeric value such as a string. The event is persisted through the standard API. On the next scheduler tick, the numeric comparison fails and the exception aborts alert processing instance-wide.
events = []
for event, tz in rows:
model = CalendarEventModel.model_validate(event)
- # Determine per-event alert window
- alert_minutes = None
- if model.meta and 'alert_minutes' in model.meta:
- alert_minutes = model.meta['alert_minutes']
+ # meta is user-writable and this poll is shared by every user.
+ alert_minutes = (model.meta or {}).get('alert_minutes')
+ if not isinstance(alert_minutes, (int, float)):
+ alert_minutes = None
if alert_minutes is not None:
if alert_minutes < 0:
Source: GitHub Commit abc69000. The patch adds an isinstance check that treats any non-numeric alert_minutes as unset, preventing the type error from reaching the comparison.
Detection Methods for CVE-2026-87012
Indicators of Compromise
- Calendar events containing meta.alert_minutes values that are not integers or floats
- Scheduler log entries showing TypeError exceptions originating from the upcoming-event alert pass
- Reports from multiple users that expected calendar reminders were not delivered during overlapping time windows
Detection Strategies
- Query the Open WebUI database for calendar events where meta->>'alert_minutes' cannot be cast to a numeric type
- Instrument the scheduler with structured logging to capture per-event exceptions and identify offending event IDs
- Correlate spikes in missed reminder notifications with recent calendar event creation or modification activity
Monitoring Recommendations
- Alert on any uncaught exception raised inside the calendar scheduler task
- Track the rate of successfully dispatched calendar reminders and flag sudden drops to zero
- Audit calendar event mutations performed by users with the calendar permission and review non-standard meta payloads
How to Mitigate CVE-2026-87012
Immediate Actions Required
- Upgrade all Open WebUI deployments to version 0.11.1 or later
- Inventory existing calendar events and normalize any meta.alert_minutes values that are not numeric
- Review which user roles hold the calendar permission and restrict it to trusted accounts until patching is complete
Patch Information
The fix is available in Open WebUI version 0.11.1. The corrective change is tracked in GitHub Pull Request #28790 and committed as abc69000. Full release notes are published at the Open WebUI v0.11.1 release page, and vendor advisory details are in GHSA-v39v-59xw-j98g.
Workarounds
- Temporarily revoke the calendar permission from non-administrative users until the upgrade is applied
- Add a database-level constraint or trigger that rejects non-numeric alert_minutes values in the calendar event meta column
- Wrap the scheduler's per-event processing in defensive exception handling so a single malformed event cannot abort the entire alert pass
# Upgrade Open WebUI to the patched release
pip install --upgrade open-webui==0.11.1
# Or, for Docker-based deployments
docker pull ghcr.io/open-webui/open-webui:0.11.1
docker stop open-webui && docker rm open-webui
docker run -d --name open-webui \
-p 3000:8080 \
-v open-webui:/app/backend/data \
ghcr.io/open-webui/open-webui:0.11.1
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

