- Package
- adminneo-org/adminneo
- Fixed in
- 5.5.1
- Published
- Fri 30 Oct 2026, 22:53 Lisbon
- Installs on Packagist
- 291
In plain words
An authenticated user can bypass AdminNeo's SQLite SQL import filter and create a PHP file, allowing code to run on the server when that file is accessed over HTTP. The filter fails to block a query when its regular expression check hits PHP's backtracking limit. This affects versions before 5.5.1 and is fixed in 5.5.1.
Affected versions
| Package | Affected | Fixed in |
|---|---|---|
| adminneo-org/adminneo | < 5.5.1 | 5.5.1 |
Am I affected?
Look for adminneo-org/adminneo in composer.lock and check whether its version is below 5.5.1. If so, check whether your project uses AdminNeo's SQLite functionality and allows authenticated users to upload SQL files through the SQL import form.
What to do
Check which version you have, then update to a fixed release for your branch (5.5.1):
composer show adminneo-org/adminneo | grep versions
composer update adminneo-org/adminneo
If your version constraint in composer.json keeps you below a fixed release, raise it first. Whether your configuration is affected, and the exact version ranges, are in the advisory itself.
The advisory's 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 zdi-disclosures@trendmicro.com
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/
Weakness: CWE-74 Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection'). Reported by zdi-disclosures, vrana.
The advisory
- GitHub Advisory Database: GHSA-p96f-p2p2-2g3h, with who is affected and how
- OSV.dev: GHSA-p96f-p2p2-2g3h
- All advisories for adminneo-org/adminneo