Oct 6, 2026·6 min read·4 visits
Filament failed to prompt for the user's password when modifying, disabling, or establishing app-based multi-factor authentication (MFA). If an attacker hijacked an active session, they could bind their own MFA token or disable the user's protection without knowing the master password.
An authentication bypass and privilege escalation vulnerability exists in Filament (filamentphp/filament) due to missing password verification during multi-factor authentication (MFA) setup and management. An attacker with access to an active session can modify or disable MFA, leading to account hijacking.
The Filament administration panel framework, which operates as a rapid-application development layer for the Laravel PHP framework, exposes crucial user profile operations through its web interface. Among these operations are management workflows for app-based multi-factor authentication (MFA). In standard secure architectures, modifications to multi-factor settings must reside behind a re-authentication barrier to ensure that only the verified account owner can alter credential settings.
Prior to the resolution of CVE-2026-104181, Filament did not consistently enforce step-up authentication or password verification for critical MFA-related actions. The components representing TOTP (Time-Based One-Time Password) setup, recovery code regeneration, and MFA deactivation did not require the user's current password. This omission created a significant vulnerability surface, leaving these functions accessible to any user session containing active authentication cookies.
Because Filament relies heavily on Laravel Livewire, its user interfaces are driven by backend-driven AJAX requests. These requests execute action logic based on the user's current session state. Consequently, any security control depending strictly on the assumption that a user has visual physical control of their screen or session is bypassed if an unauthorized entity can trigger these actions over the network.
The root cause of this vulnerability lies in a Missing Authentication for Critical Function defect, classified under CWE-306. Specifically, three Filament core action classes responsible for TOTP/App-based MFA operations omitted password confirmation logic: DisableAppAuthenticationAction, RegenerateAppAuthenticationRecoveryCodesAction, and SetUpAppAuthenticationAction.
In a standard secure web application workflow, the configuration of authentication factors is treated as a sensitive administrative context. Any request to toggle MFA settings must require the user to input their password. This pattern acts as a primary defense against session hijacking and physical console access.
Within the vulnerable Filament versions, the multi-factor management forms allowed users to complete actions by merely supplying a valid current code (in the case of disabling) or by executing the action directly (in the case of regeneration or setup). Because the execution did not prompt for or validate the underlying account password against the authentication guard, the system assumed authorization purely based on session state validity.
A detailed review of the patch implemented in commit 6d4dae6d7a94ce5aefd7ed4dc836acb0e6b71bb1 demonstrates the transition from unauthenticated state mutation to verified, rate-limited step-up verification.
The patch integrates a password field directly into the action's modal form schemas using Filament's form builder component. This field leverages Laravel's active authentication guard to evaluate the submitted value against the hashed password stored in the database. Below is the structured representation of the implementation within the affected action classes:
// Integration of the password input element into the action form
$passwordInput = TextInput::make('password')
->label(__('filament-panels::auth/multi-factor/app/actions/disable.modal.form.password.label'))
->validationAttribute(__('filament-panels::auth/multi-factor/app/actions/disable.modal.form.password.validation_attribute'))
->currentPassword(guard: Filament::getAuthGuard())
->password()
->revealable(Filament::arePasswordsRevealable())
->required()
->dehydrated(false);To ensure validation is executed securely, the patch hooks into the Livewire component lifecycle, forcing validation of the user's password state path before any action logic executes:
->beforeFormValidated(function (Component $livewire) use ($passwordInput, $rateLimitAuthenticationAttempt): void {
$passwordStatePath = $passwordInput->getStatePath();
$rateLimitAuthenticationAttempt($passwordStatePath);
$livewire->validateOnly(
$passwordStatePath,
[$passwordStatePath => $passwordInput->getValidationRules()],
attributes: [$passwordStatePath => $passwordInput->getValidationAttribute()],
);
})To mitigate the risk of password brute-forcing within the authenticated session, a throttle mechanism was added. It uses the Laravel cache to limit attempts to five per session:
$rateLimitAuthenticationAttempt = static function (string $passwordStatePath): void {
$rateLimitingKey = 'filament-disable-app-authentication:' . Filament::auth()->id();
if (RateLimiter::tooManyAttempts($rateLimitingKey, maxAttempts: 5)) {
throw ValidationException::withMessages([
$passwordStatePath => __('filament-panels::auth/multi-factor/app/actions/disable.modal.form.code.messages.rate_limited'),
]);
}
RateLimiter::hit($rateLimitingKey);
};This remediation pattern is applied uniformly across all three actions. It establishes complete coverage of the vulnerable endpoints and effectively closes the bypass route.
Exploitation of CVE-2026-104181 relies on the attacker first securing access to an active, authenticated session. This prerequisite is attainable through several common vectors, including Cross-Site Scripting (XSS), physical device access, or local session hijacking.
Once inside the session, the attacker interacts with the Filament panel's user profile interface. If MFA is already configured on the target account, the attacker executes the deactivation action. Because the system does not prompt for the user's master password, the attacker can use a single active code from the legitimate user's device (if accessible) or exploit a scenario where they can regenerate recovery codes to achieve persistent backend access.
If MFA is not yet configured, the attacker registers their own mobile authenticator device. Since the setup flow does not demand password validation, Filament binds the attacker's cryptographic secret key to the victim's account. This achieves persistent access, locking out the legitimate owner and enabling subsequent MFA challenge bypasses.
The security impact of this vulnerability is measured by the potential for permanent account compromise and persistent administrative lockout. An attacker who successfully updates or registers an MFA token on a high-privilege account (such as a Filament administrator) can establish persistence that survives a basic password reset if the system continues to demand MFA validation.
The CVSS v3.1 score of 5.4 reflects the medium severity of the issue, influenced primarily by the requirement of low-privileged authenticated access (PR:L). However, within enterprise environments, administrative sessions are high-value targets, and the actual risk of account takeover via this vector is substantial.
No general confidentiality impact exists since general database contents are not directly leaked. However, integrity and availability impacts are elevated because user authentication settings are modified and users can be locked out.
To resolve this vulnerability, system administrators must update the Filament framework within their Laravel project files. Immediate patching is the only complete defense against the exploitation vectors described.
Filament versions 4.13.3 and 5.8.3 introduce the required password verification and rate-limiting features. Project dependency configurations should be updated immediately to target these versions or higher.
In environments where updates cannot be deployed instantly, developers can mitigate the risk by auditing their custom profile pages. This ensures that any action mutating security settings implements step-up password verification manually. Monitoring the application cache for authentication-related rate limits can also assist in detecting active attempts to abuse the endpoints.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L| Product | Affected Versions | Fixed Version |
|---|---|---|
Filament filamentphp | >= 4.0.0, < 4.13.3 | 4.13.3 |
Filament filamentphp | >= 5.0.0, < 5.8.3 | 5.8.3 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-306 |
| Attack Vector | Network (AV:N) |
| CVSS Score | 5.4 |
| EPSS Score | 0.0034 |
| Impact | Account Takeover / Multi-Factor Authentication Bypass |
| Exploit Status | poc |
| KEV Status | Not Listed |
The application does not perform identity authentication or validation steps when a user attempts to execute a highly sensitive action, specifically mutating multi-factor authentication parameters.
CVE-2026-102275 (GHSA-x33g-cr3x-6449) is a public/private key identity confusion vulnerability in PyJWT versions 2.1.0 through 2.14.0. When importing Octet Key Pair (OKP) JSON Web Keys (JWKs) representing Ed25519 or Ed448 curves, PyJWT fails to verify that the public parameter 'x' matches the private parameter 'd'. An attacker can construct a hybrid JWK combining a victim's public key with the attacker's private key. In protocols like DPoP that bind sessions via public key thumbprints, this allows the attacker to authenticate as the victim while signing proofs with their own private key, fully bypassing sender-constrained security guarantees.
A critical Denial of Service (DoS) vulnerability exists in @socket.io/cluster-engine before version 0.1.1. Unauthenticated remote attackers can crash the server process by supplying inherited prototype property names as session identifiers.
A vulnerability in the Client-Side Field-Level Encryption (CSFLE) component of the MongoDB Python Driver (PyMongo) allows an attacker with database write access to trigger local Unix domain socket connections. By manipulating the Key Management Service (KMS) endpoint configuration inside the key vault collection to end with a '.sock' extension, an attacker forces the application to perform a Server-Side Request Forgery (SSRF) against internal Unix domain sockets.
A critical double-free vulnerability exists in the Transparent Inter-Process Communication (TIPC) module of the Linux kernel, specifically within the fragment reassembly implementation in `tipc_buf_append()`. This vulnerability can be triggered locally or remotely to cause kernel heap corruption, leading to local privilege escalation or denial of service.
CVE-2026-72137 is a critical double-free vulnerability in the Linux kernel's XFRM (IPsec) subsystem. The vulnerability occurs when the kernel attempts to send NAT keepalive packets over UDP. Under specific transmission failure conditions, both the downstream networking stack and the upstream keepalive dispatcher attempt to free the same socket buffer (sk_buff) structure, leading to kernel memory corruption, denial of service, or potential local privilege escalation.
A critical host injection vulnerability exists in PyMongo's connection string parser prior to version 4.18.2. The parser globally decodes percent-encoded characters in the host portion before splitting on delimiters, allowing attackers to inject arbitrary servers into the database client's connection pool.