Skip to content
Heist/ feed
Back to feed
Critical

Grav < 2.0.4 2FA Bypass via Secret Regeneration

Type: advisorySources: OSV

Grav before 2.0.4 contains a two-factor authentication bypass vulnerability in the login plugin where the regenerate2FASecret task checks only user existence, not authorization, during the pending TOTP challenge window. Attackers who know the victim's password can call this task without a CSRF nonce to overwrite the 2FA secret with an attacker-chosen value, compute a valid TOTP code, and complete authentication while reducing 2FA to password-only protection.

Products
Not specified
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2026-62232, CVE-2026-62669
Confirmed fixed CVEs
Not specified
Updated in this feed
3 Nov 2026, 19:26 UTC · Revision 1

Source evidence

Grav < 2.0.4 2FA Bypass via Secret Regeneration

core-osv · Original source

Published 17 Jul 2026, 00:07 UTC

Grav before 2.0.4 contains a two-factor authentication bypass vulnerability in the login plugin where the regenerate2FASecret task checks only user existence, not authorization, during the pending TOTP challenge window. Attackers who know the victim's password can call this task without a CSRF nonce to overwrite the 2FA secret with an attacker-chosen value, compute a valid TOTP code, and complete authentication while reducing 2FA to password-only protection.

osv:CVE-2026-62232
Complete source record
{
  "id": "2302ade8dc13e144f00f122d438b2dd0dcf33bff2b030e23d5d5c5b86f718150",
  "url": "https://osv.dev/vulnerability/CVE-2026-62232",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "Grav < 2.0.4 2FA Bypass via Secret Regeneration",
    "summary": "Grav before 2.0.4 contains a two-factor authentication bypass vulnerability in the login plugin where the regenerate2FASecret task checks only user existence, not authorization, during the pending TOTP challenge window. Attackers who know the victim's password can call this task without a CSRF nonce to overwrite the 2FA secret with an attacker-chosen value, compute a valid TOTP code, and complete authentication while reducing 2FA to password-only protection.",
    "evidence": "osv:CVE-2026-62232",
    "products": [],
    "severity": "critical",
    "structured": {
      "id": "CVE-2026-62232",
      "aliases": [
        "CVE-2026-62232",
        "CVE-2026-62669",
        "GHSA-7mgc-c7pq-3rr3"
      ],
      "metrics": [
        {
          "type": "CVSS_V4",
          "score": "CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "repo": "https://github.com/getgrav/grav",
              "type": "GIT",
              "events": [
                {
                  "introduced": "0"
                },
                {
                  "fixed": "c22d77d2ec2a9202d9f005f4ceda9c1483921286"
                }
              ],
              "database_specific": {
                "extracted_events": [
                  {
                    "range": [
                      {
                        "introduced": "0"
                      },
                      {
                        "fixed": "2.0.4"
                      }
                    ],
                    "source": "AFFECTED_FIELD",
                    "strategy": "StandardRange"
                  },
                  {
                    "range": [
                      {
                        "introduced": "0"
                      },
                      {
                        "fixed": "2.0.4"
                      }
                    ],
                    "source": "DESCRIPTION"
                  }
                ]
              }
            }
          ],
          "versions": [
            "2.0.3",
            "2.0.2",
            "2.0.1",
            "1.7.53",
            "1.7.52",
            "1.7.51",
            "1.7.39.1",
            "1.7.39",
            "1.7.38",
            "1.7.37.1",
            "1.7.37",
            "1.7.36",
            "1.7.35",
            "1.7.34",
            "1.7.33",
            "1.7.32",
            "1.7.31",
            "1.7.30",
            "1.7.29.1",
            "1.7.29",
            "1.7.28",
            "1.7.27.1",
            "1.7.27",
            "1.7.26.1",
            "1.7.26",
            "1.7.25",
            "1.7.24",
            "1.7.23",
            "1.7.22",
            "1.7.21",
            "1.7.20",
            "1.7.19",
            "1.7.18",
            "1.7.17",
            "1.7.16",
            "1.7.15",
            "1.7.14",
            "1.7.13",
            "1.7.12",
            "1.7.10",
            "1.7.9",
            "1.7.8",
            "1.7.7",
            "1.7.6",
            "1.7.5",
            "1.7.4",
            "1.7.3",
            "1.7.1",
            "1.7.0",
            "1.7.0-rc.20",
            "1.7.0-rc.19",
            "1.7.0-rc.18",
            "1.7.0-rc.17",
            "1.7.0-rc.15",
            "1.7.0-rc.14",
            "1.7.0-rc.13",
            "1.7.0-rc.12",
            "1.7.0-rc.10",
            "1.7.0-rc.9",
            "1.7.0-rc.8",
            "1.7.0-rc.7",
            "1.7.0-rc.6",
            "1.7.0-rc.5",
            "1.7.0-rc.4",
            "1.7.0-rc.3",
            "1.7.0-rc.2",
            "1.7.0-rc.1",
            "1.7.0-beta.10",
            "1.7.0-beta.9",
            "1.7.0-beta.8",
            "1.7.0-beta.7",
            "1.7.0-beta.6",
            "1.7.0-beta.5",
            "1.7.0-beta.4",
            "1.7.0-beta.3",
            "1.7.0-beta.2",
            "1.7.0-beta.1",
            "1.6.0-rc.4",
            "1.6.0-rc.3",
            "1.6.0-rc.2",
            "1.6.0-rc.1",
            "1.6.0-beta.8",
            "1.6.0-beta.7",
            "1.6.0-beta.6",
            "1.6.0-beta.5",
            "1.6.0-beta.2",
            "1.6.0-beta.1",
            "1.5.0-rc.1",
            "1.5.0-beta.2",
            "1.5.0-beta.1",
            "1.3.0-rc.5",
            "1.3.0-rc.4",
            "1.3.0-rc.3",
            "1.3.0-rc.1",
            "1.2.0-rc.3",
            "1.2.0-rc.2",
            "1.2.0-rc.1",
            "1.1.9-rc.3",
            "1.1.9-rc.2",
            "1.1.9-rc.1",
            "1.1.0-rc.3",
            "1.1.0-rc.2",
            "1.1.0-rc.1",
            "1.1.0-beta.5",
            "1.1.0-beta.4",
            "1.1.0-beta.3",
            "1.1.0-beta.2",
            "1.1.0-beta.1",
            "0.9.19",
            "0.9.18",
            "0.9.17",
            "0.9.16",
            "0.9.15",
            "0.9.14",
            "0.9.13",
            "0.9.12",
            "0.9.11",
            "0.9.10",
            "0.9.9",
            "0.9.8",
            "0.9.7",
            "0.9.6",
            "0.9.5",
            "0.9.4",
            "0.9.3",
            "0.9.2",
            "0.9.0",
            "0.8.0"
          ],
          "database_specific": {
            "source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-62232.json"
          }
        }
      ],
      "modified": "2026-10-28T02:30:31.513999775Z",
      "provider": "osv",
      "references": [
        "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/62xxx/CVE-2026-62232.json",
        "https://github.com/getgrav/grav/security/advisories/GHSA-7mgc-c7pq-3rr3",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-62232",
        "https://www.vulncheck.com/advisories/grav-2fa-bypass-via-secret-regeneration",
        "https://github.com/getgrav/grav"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-862"
        ],
        "cna_assigner": "VulnCheck",
        "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/62xxx/CVE-2026-62232.json"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-62232",
        "evidence": "/id"
      },
      {
        "value": "CVE-2026-62669",
        "evidence": "/aliases"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 498684,
  "published_at": "2026-07-17T00:07:08.361+00:00"
}