CVE-2026-39923
HighCVSS 8.1Exploitation Probability (EPSS)
Low risk18th percentile - higher than 18% of all known CVEs
Summary
Flarum before 1.8.16 contains a password reset token expiry bypass vulnerability that allows unauthenticated attackers to reuse expired password reset tokens by submitting them directly to the reset processing endpoint. The SavePasswordController::handle() method calls PasswordToken::findOrFail() without performing any expiry validation, allowing attackers to bypass the 24-hour token lifetime enforced only during form rendering and change any account's password to gain an authenticated session.
Risk Assessment
An attacker could take over user accounts, potentially leading to data integrity and confidentiality breaches.
Recommendation
Upgrade Flarum to version 1.8.16 or later and consider implementing additional security mechanisms for password resets.
Other vulnerabilities in Flarum
See all- CVE-2026-39924Medium
Flarum before 1.8.16 contains an improper session invalidation vulnerability that allows attackers who hold a valid session token to retain full account access after a victim changes their password, because the access_tokens table is never cleared on password change events. The TokensClearer::clearPasswordTokens() function only removes rows from the password_tokens table while leaving all active session cookies and API bearer tokens intact, including long-lived RememberAccessToken entries, and administrator-forced password resets via the user update endpoint are equally ineffective at revoking attacker-held sessions.
- CVE-2023-40033High
Flarum, an open source forum software, is vulnerable to a Blind Server-Side Request Forgery (SSRF) attack and file disclosure on the server, even with a basic user account. By exploiting the vulnerability, an attacker can manipulate the application to execute unintended actions.
Original NVD description (English source)
Flarum before 1.8.16 contains a password reset token expiry bypass vulnerability that allows unauthenticated attackers to reuse expired password reset tokens by submitting them directly to the reset processing endpoint. The SavePasswordController::handle() method calls PasswordToken::findOrFail() without performing any expiry validation, allowing attackers to bypass the 24-hour token lifetime enforced only during form rendering and change any account's password to gain an authenticated session.

