{"items":[{"id":"NVI-00004405","kind":"vulnerability","title":"AdminNeo: CSRF Token Secret Recoverable from Single Observed Token, Enabling Cross-Site Request Forgery","revision":2,"unknowns":["Customer inventory, deployment, reachability and exploitation have not been inspected."],"lifecycle":"active","identifiers":["GHSA-wm25-49w3-5qrg","CVE-2026-96629"],"plain_summary":"GitHub lists this reviewed advisory for adminneo-org/adminneo. Published version ranges and source prerequisites are shown below; this is not an inspection of a visitor’s application.","review_status":"source_listed","control_topics":[],"public_actions":[{"summary":"Identify the exact component and deployed version, examine the linked publisher’s conditions, and retain evidence of any mitigation.","source_ids":["sr-4a894d0647ff3a00485a878a49461301"],"action_type":"investigate","limitations":"Confirm current vendor support, compatibility and deployment evidence. This report has not tested a fix in your system.","current_supported_target":null},{"summary":"The original advisory lists fixed boundaries 5.5.1 for adminneo-org/adminneo. Confirm the publisher’s latest guidance.","source_ids":["sr-652c1f3f6bbdf0f7887a36bcd72a590c"],"action_type":"vendor_patch","limitations":"Confirm current vendor support, compatibility and deployment evidence. This report has not tested a fix in your system.","current_supported_target":null}],"schema_version":"1.1.0","source_metrics":[{"kind":"CVSS","as_of":"2026-10-30T22:51:31.000Z","value":"6.8 medium","meaning":"GitHub source severity; exploitability and local consequence require separate evidence.","source_id":"sr-4a894d0647ff3a00485a878a49461301"}],"why_it_matters":"Published affected context helps an owner decide what evidence to gather. This report has not examined your application.","related_sources":[{"id":"sr-4a894d0647ff3a00485a878a49461301","url":"https://github.com/advisories/GHSA-wm25-49w3-5qrg","basis":"vendor_advisory","notes":"GitHub Advisory Database; CC-BY-4.0. Each advisory links its original attribution. Null normalizes fields.","title":"GHSA-wm25-49w3-5qrg","publisher":"GitHub Advisory Database","observed_at":"2026-10-31T21:55:49.621Z"},{"id":"sr-652c1f3f6bbdf0f7887a36bcd72a590c","url":"https://github.com/advisories/GHSA-wm25-49w3-5qrg","basis":"vendor_advisory","notes":"GitHub-origin advisory, CC-BY-4.0; OSV is an aggregate copy, not independent corroboration.","title":"GHSA-wm25-49w3-5qrg","publisher":"GitHub Advisory Database via OSV","observed_at":"2026-10-31T21:42:41.388Z"}],"affected_context":[{"certainty":"source_listed","source_ids":["sr-4a894d0647ff3a00485a878a49461301"],"technology":"adminneo-org/adminneo","known_exclusions":[],"conditions_summary":"### Summary\n\nAdminNeo'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.\n\nOriginally reported by @az0mb13 in Adminer: GHSA-q4f2-39gr-45jh\n\n### Details\nToken generation in `admin/include/functions.inc.php` lines 1181-1184:\n\n```php\nfunction get_token() {\n\t$rand = rand(1, 1e6);\n\treturn ($rand ^ $_SESSION[\"token\"]) . \":$rand\";\n}\n```\n\nToken verification in lines 1189-1192:\n\n```php\nfunction verify_token() {\n\tlist($token, $rand) = explode(\":\", $_POST[\"token\"]);\n\treturn ($rand ^ $_SESSION[\"token\"]) == $token;\n}\n```\n\nSession token initialized in `admin/include/auth.inc.php` lines 327 and 385:\n\n```php\n$_SESSION[\"token\"] = rand(1, 1e6);\n```\n\n**Three distinct weaknesses:**\n1. **In","public_affected_ranges":["< 5.5.1"]},{"certainty":"source_listed","source_ids":["sr-652c1f3f6bbdf0f7887a36bcd72a590c"],"technology":"adminneo-org/adminneo","known_exclusions":[],"conditions_summary":"### Summary\n\nAdminNeo'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.\n\nOriginally reported by @az0mb13 in Adminer: GHSA-q4f2-39gr-45jh\n\n### Details\nToken generation in `admin/include/functions.inc.php` lines 1181-1184:\n\n```php\nfunction get_token() {\n\t$rand = rand(1, 1e6);\n\treturn ($rand ^ $_SESSION[\"token\"]) . \":$rand\";\n}\n```\n\nToken verification in lines 1189-1192:\n\n```php\nfunction verify_token() {\n\tlist($token, $rand) = explode(\":\", $_POST[\"token\"]);\n\treturn ($rand ^ $_SESSION[\"token\"]) == $token;\n}\n```\n\nSession token initialized in `admin/include/auth.inc.php` lines 327 and 385:\n\n```php\n$_SESSION[\"token\"] = rand(1, 1e6);\n```\n\n**Three distinct weaknesses:**\n1. **In","public_affected_ranges":["ECOSYSTEM: introduced 0; fixed 5.5.1"]}],"null_published_at":"2026-10-31T22:13:27.124Z","source_updated_at":"2026-10-30T22:51:31.000Z","source_disclosed_at":"2026-10-30T22:51:29.000Z","is_synthetic_fixture":false,"null_last_reviewed_at":null,"public_change_summary":"Source facts changed; compare the preserved prior revision.","null_first_observed_at":"2026-10-31T21:42:41.388Z"}],"next_cursor":null,"snapshot_revision":"42594"}