CVE-2026-96634 — adminneo
Fix: adminneo-org/adminneo@7e5658fCVE-2026-96634 is a remote code execution vulnerability in adminneo-org/adminneo. A fix is available for adminneo-org/adminneo — see the affected versions and patch details below.
AdminNeo SQLite: multi_query Incorrect Check of Function Return Value RCE
Real-World Exposure
adminneo-org/adminneoReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects Packagist packages — download data is not available via public APIs for these ecosystems.
Description
Summary
This vulnerability is a patch bypass that exploits catastrophic backtracking in a regular expression used to filter ATTACH statements in AdminNeo's SQLite functionality. The original vulnerability (CVE-2021-43008) allowed authenticated users to create PHP files through SQLite ATTACH statements, achieving remote code execution. The patch introduced a regex filter to block ATTACH queries, but this filter is vulnerable to catastrophic backtracking.
Originally reported by @zdi-disclosures in Adminer: https://github.com/vrana/adminer/security/advisories/GHSA-3582-q6xq-5vf7
Analysis
[Source] sql.inc.php :: SQL import handler:47
$query = get_file("sql_file", true, ";");
User uploads a malicious SQL file through the import form. The file content is read into the
$queryvariable without any initial sanitization.
[Transform] sql.inc.php :: SQL import handler:87
// Query parsing loop that extracts individual SQL statements
The uploaded SQL content is processed in a loop that splits it into individual queries. Each query
$queryis extracted for processing.
[Context] sql.inc.php :: SQL import handler:65
$space = "(?:\\s|/\\*[\s\S]*?\\*/|(?:#|$line_comment)[^\n]*\n?|--\r?\n)";
Definition of the
$spaceregex pattern used in the ATTACH filter. The possessive quantifier*+combined with SQLite comment patterns (--) creates the catastrophic backtracking vulnerability when many comment lines are processed.
[Transform] sql.inc.php :: SQL import handler:146
if (DIALECT == "sqlite" && preg_match("~^$space*+ATTACH\\b~i", $q, $match)) {
The ATTACH query filter check. When the regex encounters 350,000 SQLite comment lines (
--), it triggers catastrophic backtracking. The possessive quantifier*+causes exponential backtracking, eventually hitting PHP's backtracking limit and causingpreg_match()to returnfalseinstead of0or1, bypassing the security filter.
[Sink] sql.inc.php :: SQL import handler:162
Connection::get()->multiQuery($q)
When the ATTACH filter is bypassed due to the
preg_match()returningfalse, the malicious SQL query containing the ATTACH statement is executed. This allows the attacker to create a.phpfile with embedded PHP code, achieving remote code execution when the file is accessed via HTTP.
The root cause is that PHP's preg_match() function returns false when the backtracking limit is exceeded, but the code only checks for truthy values (1 for match), treating false the same as 0 (no match). This allows the ATTACH statement to bypass the security filter.
-- CREDIT --------------------------------------- This vulnerability was discovered by: 0daystolive (Sorcery Ltd) working with TrendAI Zero Day Initiative
Zero Day Initiative [email protected]
The PGP key used for all ZDI vendor communications is available from: http://www.zerodayinitiative.com/documents/disclosures-pgp-key.asc
-- INFORMATION ABOUT THE ZDI -------------------- Established by TippingPoint and acquired by Trend Micro, the Zero Day Initiative (ZDI) neither re-sells vulnerability details nor exploit code. Instead, upon notifying the affected product vendor, the ZDI provides its Trend Micro TippingPoint customers with zero day protection through its intrusion prevention technology. Explicit details regarding the specifics of the vulnerability are not exposed to any parties until an official vendor patch is publicly available.
Please contact us for further details or refer to:
http://www.zerodayinitiative.com
-- DISCLOSURE POLICY ---------------------------- Our vulnerability disclosure policy is available online at: http://www.zerodayinitiative.com/advisories/disclosure_policy/
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐘Packagist | adminneo-org/adminneo | all versions | 5.5.1composer require adminneo-org/adminneo:^5.5.1 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for adminneo-org/adminneo, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update adminneo-org/adminneo to 5.5.1 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-96634 is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
Frequently Asked Questions
Is CVE-2026-96634 in your dependencies?
Find it across Packagist, including transitive dependencies.