Filament CVE-2026-55409
HIGHSeverity by source
AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:L/A:N
Network-reachable stored XSS requiring a low-privileged author (PR:L) and a victim viewing the disabled form (UI:R); script in victim's browser yields scope change with high confidentiality and limited integrity impact.
Primary rating from Vendor (https://github.com/filamentphp/filament).
CVSS VectorVendor: https://github.com/filamentphp/filament
Lifecycle Timeline
2DescriptionCVE.org
In Filament v3, a disabled RichEditor field rendered its raw state without sanitizing HTML. Where the data stored in this field's state isn't sanitized already when the form state was filled, an attacker could plant malicious HTML or JavaScript and achieve XSS that executes for users who view the form.
Please note that Filament v4 and above does not use the same mechanism for rendering a disabled RichEditor so this advisory does not apply.
AnalysisAI
Stored XSS in Filament v3 PHP admin panel framework occurs when a RichEditor form field is rendered in disabled mode, because the disabled view binds raw state via Alpine's x-html directive without HTML sanitization. Authenticated attackers who can write into the underlying field state can plant HTML or JavaScript that executes in the browser of any user later viewing the form, with no public exploit identified at time of analysis and no KEV listing.
Technical ContextAI
Filament is a TALL-stack (Tailwind, Alpine, Laravel, Livewire) admin panel and form builder distributed as the Composer package filamentphp/filament (CPE pkg:composer/filament_forms). The vulnerable code path is packages/forms/resources/views/components/rich-editor.blade.php, where the disabled-state branch wrapped the entangled Livewire state in an Alpine x-data block and rendered it through x-html="state", causing the DOM to interpret stored HTML attributes such as onerror as live script. This is a textbook CWE-79 (Improper Neutralization of Input During Web Page Generation) instance: the framework trusted that upstream code had pre-sanitized the persisted RichEditor content, but provided no defense-in-depth at render time. The fix replaces the Alpine x-html binding with a server-side Blade echo through Filament's str()->sanitizeHtml() helper, neutralizing event-handler attributes and script payloads before they reach the browser.
RemediationAI
Vendor-released patch: Filament 3.3.53 - upgrade filamentphp/filament (and the forms sub-package) via composer update filamentphp/filament:^3.3.53, referencing the release at https://github.com/filamentphp/filament/releases/tag/v3.3.53 and the fix in https://github.com/filamentphp/filament/pull/20029. If upgrading immediately is not possible, sanitize RichEditor content at write time using a server-side HTML sanitizer (for example HTMLPurifier or Laravel's str()->sanitizeHtml()) inside model mutators or form afterStateUpdated hooks, or avoid using ->disabled() on RichEditor fields and switch to a read-only Placeholder/View component that renders escaped text - note that this changes UX and loses formatting. Restricting who can author content into RichEditor-backed columns reduces, but does not eliminate, exposure since any historical unsanitized data remains dangerous on render.
Same weakness CWE-79 – Cross-site Scripting (XSS)
View allShare
External POC / Exploit Code
Leaving vuln.today
GHSA-m9cv-24rx-8mv7