Skip to content
Heist/ feed
Back to feed
Critical

Flarum < 1.8.16 Password Reset Token Expiry Bypass via POST /reset

Type: advisorySources: OSV

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.

Products
Not specified
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2026-39923
Confirmed fixed CVEs
Not specified
Updated in this feed
2 Nov 2026, 21:18 UTC · Revision 1

Source evidence

Flarum < 1.8.16 Password Reset Token Expiry Bypass via POST /reset

core-osv · Original source

Published 5 Aug 2026, 14:38 UTC

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.

osv:CVE-2026-39923
Complete source record
{
  "id": "789ba2ebe94ed05d225c75c4587aeaf6c87514661ab6886aa30f20f9c2a0dcfe",
  "url": "https://osv.dev/vulnerability/CVE-2026-39923",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "Flarum < 1.8.16 Password Reset Token Expiry Bypass via POST /reset",
    "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.",
    "evidence": "osv:CVE-2026-39923",
    "products": [],
    "severity": "critical",
    "structured": {
      "id": "CVE-2026-39923",
      "aliases": [
        "CVE-2026-39923"
      ],
      "metrics": [
        {
          "type": "CVSS_V4",
          "score": "CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "repo": "https://github.com/flarum/framework",
              "type": "GIT",
              "events": [
                {
                  "introduced": "0"
                },
                {
                  "fixed": "a2260e4a62f21591e1a9ae9b11c7db07c6507766"
                },
                {
                  "fixed": "2803058d0f9dc38252326070b46d4484fe5a857d"
                }
              ],
              "database_specific": {
                "extracted_events": [
                  {
                    "range": [
                      {
                        "introduced": "0"
                      },
                      {
                        "fixed": "1.8.16"
                      }
                    ],
                    "source": "AFFECTED_FIELD",
                    "strategy": "StandardRange"
                  },
                  {
                    "range": [
                      {
                        "fixed": "a2260e4a62f21591e1a9ae9b11c7db07c6507766"
                      }
                    ],
                    "source": "REFERENCES_TAG",
                    "original_tag": "v1.8.16"
                  },
                  {
                    "range": [
                      {
                        "fixed": "2803058d0f9dc38252326070b46d4484fe5a857d"
                      }
                    ],
                    "source": "REFERENCES_COMMIT"
                  }
                ]
              }
            }
          ],
          "versions": [
            "v1.8.15",
            "v1.8.14",
            "v1.8.13",
            "v1.8.12",
            "v1.8.11",
            "v1.8.10",
            "v1.8.9",
            "v1.8.8",
            "v1.8.7",
            "v1.8.6",
            "v1.8.5",
            "v1.8.3",
            "v1.8.2",
            "v1.8.1",
            "v1.8.0",
            "v1.7.1",
            "v1.7.0",
            "v1.6.1",
            "v1.6.0",
            "v1.5.0",
            "v1.4.0",
            "v1.3.1",
            "v1.3.0"
          ],
          "database_specific": {
            "source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-39923.json"
          }
        }
      ],
      "modified": "2026-10-28T02:30:23.571586478Z",
      "provider": "osv",
      "references": [
        "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/39xxx/CVE-2026-39923.json",
        "https://github.com/flarum/framework/releases/tag/v1.8.16",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-39923",
        "https://www.vulncheck.com/advisories/flarum-password-reset-token-expiry-bypass-via-post-reset",
        "https://github.com/flarum/framework/pull/4545",
        "https://github.com/flarum/framework/commit/2803058d0f9dc38252326070b46d4484fe5a857d",
        "https://github.com/flarum/framework"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-324"
        ],
        "cna_assigner": "VulnCheck",
        "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/39xxx/CVE-2026-39923.json"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-39923",
        "evidence": "/id"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 490197,
  "published_at": "2026-08-05T14:38:35.604+00:00"
}