Skip to content
Heist/ feed
Back to feed
Critical

Cotonti through 1.0.0 Predictable Password Recovery Token via Weak PRNG

Type: advisorySources: OSV

Cotonti through 1.0.0 derives password recovery validation tokens from md5(microtime()) in users.passrecover.php, creating a predictable token space of approximately one million values per second. Unauthenticated attackers can read the server Date header, precompute candidate tokens within a narrow time window, and probe them against the passrecover authentication endpoint to reset any account password including administrators.

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

Source evidence

Cotonti through 1.0.0 Predictable Password Recovery Token via Weak PRNG

core-osv · Original source

Published 18 Sept 2026, 19:56 UTC

Cotonti through 1.0.0 derives password recovery validation tokens from md5(microtime()) in users.passrecover.php, creating a predictable token space of approximately one million values per second. Unauthenticated attackers can read the server Date header, precompute candidate tokens within a narrow time window, and probe them against the passrecover authentication endpoint to reset any account password including administrators.

osv:CVE-2026-93868
Complete source record
{
  "id": "7d9a544ff4934a3203bdfc6723e3683527890f241898ad8b602d628b91b9d27d",
  "url": "https://osv.dev/vulnerability/CVE-2026-93868",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "Cotonti through 1.0.0 Predictable Password Recovery Token via Weak PRNG",
    "summary": "Cotonti through 1.0.0 derives password recovery validation tokens from md5(microtime()) in users.passrecover.php, creating a predictable token space of approximately one million values per second. Unauthenticated attackers can read the server Date header, precompute candidate tokens within a narrow time window, and probe them against the passrecover authentication endpoint to reset any account password including administrators.",
    "evidence": "osv:CVE-2026-93868",
    "products": [],
    "severity": "critical",
    "structured": {
      "id": "CVE-2026-93868",
      "aliases": [
        "CVE-2026-93868"
      ],
      "metrics": [
        {
          "type": "CVSS_V4",
          "score": "CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "repo": "https://github.com/cotonti/cotonti",
              "type": "GIT",
              "events": [
                {
                  "introduced": "0"
                },
                {
                  "last_affected": "0d554e939a315e7f7f18fba3ca1132b80c6a1adb"
                }
              ],
              "database_specific": {
                "extracted_events": [
                  {
                    "range": [
                      {
                        "introduced": "0"
                      },
                      {
                        "last_affected": "1.0.0"
                      }
                    ],
                    "source": "AFFECTED_FIELD",
                    "strategy": "StandardRange"
                  },
                  {
                    "range": [
                      {
                        "introduced": "0"
                      },
                      {
                        "last_affected": "1.0.0"
                      }
                    ],
                    "source": "DESCRIPTION"
                  }
                ]
              }
            }
          ],
          "versions": [
            "1.0.0",
            "0.9.25",
            "0.9.24.2",
            "0.9.24.1",
            "0.9.24",
            "0.9.23",
            "0.9.22",
            "0.9.21",
            "0.9.20.1",
            "0.9.20",
            "0.9.19",
            "0.9.19-rc1",
            "0.9.19-RC.1",
            "0.9.18.1",
            "0.9.18",
            "0.9.17",
            "0.9.16.2",
            "0.9.16.1",
            "0.9.16",
            "0.9.15",
            "0.9.14",
            "0.9.13",
            "0.9.12.1",
            "0.9.12",
            "cotonti-0.9.11.1",
            "cotonti-0.9.11",
            "cotonti-0.9.10",
            "cotonti-0.9.8",
            "cotonti-0.9.7",
            "cotonti-0.9.6",
            "cotonti-0.9.3"
          ],
          "database_specific": {
            "source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-93868.json"
          }
        }
      ],
      "modified": "2026-10-28T02:30:21.061729219Z",
      "provider": "osv",
      "references": [
        "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/93xxx/CVE-2026-93868.json",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-93868",
        "https://www.vulncheck.com/advisories/cotonti-through-1.0.0-predictable-password-recovery-token-via-weak-prng",
        "https://github.com/Cotonti/Cotonti/issues/1890",
        "https://github.com/Cotonti/Cotonti/pull/1898",
        "https://github.com/Cotonti/Cotonti",
        "https://github.com/Cotonti/Cotonti/blob/1.0.0/modules/users/inc/users.passrecover.php"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-338"
        ],
        "cna_assigner": "VulnCheck",
        "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/93xxx/CVE-2026-93868.json"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-93868",
        "evidence": "/id"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 487254,
  "published_at": "2026-09-18T19:56:34.779+00:00"
}