Skip to main content

AdminNeo CVE-2026-96634

MEDIUM
Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection') (CWE-74)
2026-10-30 https://github.com/adminneo-org/adminneo GHSA-p96f-p2p2-2g3h
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate to AdminNeo with SQLite connection
  2. Delivery
    Upload crafted SQL import with ~350,000 comment lines
  3. Exploit
    Catastrophic backtracking makes preg_match() return false
  4. Execution
    ATTACH filter bypassed, malicious query reaches multiQuery()
  5. Persist
    ATTACH writes PHP file to web path
  6. Impact
    Request file over HTTP to execute code

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Input neutralization, injection prevention
Exploitation Conditions

Exploitation requires an authenticated AdminNeo session with an active SQLite connection and access to the SQL file import feature (DIALECT == "sqlite"); the attacker uploads a SQL file whose ATTACH statement is preceded by roughly 350,000 SQLite line comments (--) so that the ~^$space*+ATTACH\b~i filter regex exceeds PHP's pcre.backtrack_limit, making preg_match() return false - which the pre-5.5.1 code treats as no-match - and the created .php file must land in a web-accessible, PHP-executing location to be retrieved over HTTP. Limiting factors that reduce realistic risk: valid authentication is required (not remote-unauthenticated), the SQLite dialect must be in use, success depends on the PHP backtracking limit actually being hit (dependent on pcre.backtrack_limit configuration), and a writable web-reachable path is needed for the dropped PHP file.

Impact

No CVSS vector or score is provided by NVD/vendor (CVSS: N/A), and there is no EPSS score, no CISA KEV listing, and no confirmed public exploit in the supplied data, so quantitative exploitation signals are absent and the raw severity must be inferred from the mechanism. The GitHub Security Advisory (GHSA-p96f-p2p2-2g3h) and the patch commit confirm the core facts: this is a bypass of the fix for CVE-2021-43008, in which catastrophic backtracking in the ~^$space*+ATTACH\b~i regex drives PHP's preg_match() past its backtracking limit so it returns false, which the vulnerable code treats as 'no match' (0), letting a blocked SQLite ATTACH statement through to multiQuery() and yielding PHP-file write / RCE. Based on my own assessment the technical impact is high (authenticated-to-RCE, AV:N/AC:L/PR:L → 8.8-class), but the real-world priority is tempered by a hard precondition the original CVE establishes - the attacker must already be an authenticated AdminNeo user with a SQLite connection and access to the SQL import form - and by the product's limited deployment footprint. The vendor-assigned priority is 'this_month' (not act_now/emergency) and a fix (v5.5.1) is available, which is consistent with a genuinely exploitable but authentication-gated, niche-product issue rather than a mass-exploitation emergency; absence of EPSS/KEV/POC data should be read as 'no signal', not as low risk.

Exploit ScenarioDerived

An authenticated AdminNeo user who can reach the SQL import form while connected to a SQLite database uploads a crafted .sql file containing roughly 350,000 SQLite line-comment lines (--) ahead of an ATTACH statement. The comment flood triggers catastrophic backtracking in the ATTACH filter regex, forcing preg_match() to exceed PHP's backtracking limit and return false, which the code treats as no-match; the ATTACH executes and writes a .php file with embedded code, and the attacker then requests that file over HTTP to run arbitrary PHP. No public exploit is identified in the supplied data, though the advisory documents the full source-to-sink chain.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 30, 2026

AdminNeo versions before 5.5.1 contain a patch bypass in the SQLite SQL-import handler that restores a remote code execution primitive originally described in CVE-2021-43008. An authenticated user with an active SQLite connection uploads a SQL file whose ATTACH statement is preceded by roughly 350,000 SQLite line comments (--), driving the ~^$space*+ATTACH\b~i guard regex past PHP's pcre.backtrack_limit so that preg_match() returns false; the pre-5.5.1 code treats that false as a non-match, and the ATTACH query reaches Connection::get()->multiQuery(), letting the attacker write a .php file that executes when retrieved over HTTP. The assessed CVSS:3.1 vector is AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H, so the attacker must be authenticated; no CISA KEV listing, no EPSS score, and no confirmed public exploit code were present in the supplied data. Fixing it is a one-line change: AdminNeo 5.5.1 makes the check preg_match(...) !== 0, so a false return no longer passes the filter.

RemediationAI

Upgrade to AdminNeo 5.5.1 or later, which changes the ATTACH guard in admin/sql.inc.php to preg_match("~^$space*+ATTACH\\b~i", $q, $match) ! 0 so a preg_match() false result no longer bypasses the filter (release: https://github.com/adminneo-org/adminneo/releases/tag/v5.5.1, commit: https://github.com/adminneo-org/adminneo/commit/7e5658ffb0d890cd1a6152a09e3172da85ca4b77, advisory: https://github.com/adminneo-org/adminneo/security/advisories/GHSA-p96f-p2p2-2g3h). Vendor-released patch: AdminNeo 5.5.1. If upgrading immediately is not possible, apply the one-line ! 0 comparison to the ATTACH check in admin/sql.inc.php as a manual backport, and in the interim restrict the SQL file import feature and SQLite dialect access to trusted administrators only, since the assessed vector requires an authenticated session (PR:L) with an active SQLite connection - noting that these restrictions are access-control trade-offs and do not correct the flawed return-value handling. Additional hardening consistent with the exploitation conditions: ensure the PHP process cannot write into directories served and executed by the web server, since the code-execution step depends on the dropped .php file being web-reachable and PHP-executable, and review pcre.backtrack_limit settings; neither measure is a substitute for patching because the underlying filter bypass remains present.

Affected Packages

composer adminneo-org/adminneo fix: 5.5.1

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in composer

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

AdminNeo is a PHP database administration tool (a maintained fork lineage of Adminer) whose admin/sql.inc.php import handler reads an uploaded file into $query, splits it into individual statements, and for the SQLite dialect screens each statement with the regex ~^$space*+ATTACH\b~i, where $space = "(?:\\s|/\\*[\s\S]*?\*/|(?:#|$line_comment)[^\n]*\n?|--\r?\n)". The pattern combines alternations that all match whitespace or comments with a possessive quantifier, so a long run of -- line comments produces extreme backtracking inside PCRE; once pcre.backtrack_limit is exceeded, preg_match() returns false rather than 0 or 1. The vulnerability class is mapped to CWE-74 (Improper Neutralization of Special Elements in Output Used by a Downstream Component, i.e. injection), and the specific defect is an incorrect check of a function return value: the original code tested only truthiness, collapsing the distinct false (error) and 0 (no match) results. Because false was treated as 'no ATTACH found', the statement was forwarded to the multiQuery() sink, and SQLite's ATTACH can create a database file at an attacker-chosen path - including a .php file with embedded PHP that runs if served by the web server. The upstream fix in commit 7e5658ffb0d890cd1a6152a09e3172da85ca4b77 changes the comparison to !== 0, and the CHANGELOG entry for AdminNeo 5.5.1 records 'SQLite: Disallow ATTACH commands'. The package coordinate is composer/adminneo-org/adminneo, vulnerable below 5.5.1 and fixed in 5.5.1.

Know when Sqlite gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

vuln.today AI 8.8 HIGH

Authenticated web user (PR:L) sends a crafted SQL import over the network (AV:N) with a deterministic backtracking trigger (AC:L, no victim interaction); successful bypass yields PHP write and RCE (C/I/A:H).

3.1 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

DescriptionCVE.org

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

php
$query = get_file("sql_file", true, ";");

> User uploads a malicious SQL file through the import form. The file content is read into the $query variable without any initial sanitization.

[Transform] sql.inc.php :: SQL import handler:87

php
// 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 $query is extracted for processing.

[Context] sql.inc.php :: SQL import handler:65

php
$space = "(?:\\s|/\\*[\s\S]*?\\*/|(?:#|$line_comment)[^\n]*\n?|--\r?\n)";

> Definition of the $space regex 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

php
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 causing preg_match() to return false instead of 0 or 1, bypassing the security filter.

[Sink] sql.inc.php :: SQL import handler:162

php
Connection::get()->multiQuery($q)

> When the ATTACH filter is bypassed due to the preg_match() returning false, the malicious SQL query containing the ATTACH statement is executed. This allows the attacker to create a .php file 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/

Threat Intelligence Overview

Prevalence
Low
niche Adminer fork distributed via Composer, limited enterprise footprint
Threat Intel
1
1 source
Data Quality
2 sources
Confidence: Low
CVE.org GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

Attack Technique

Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.

Affected Products (CPE)CVE.org

pkg:composer/adminneo-org_adminneo

More in Sqlite

View all
CVE-2015-5895 CRITICAL POC
10.0 Sep 18

Multiple unspecified vulnerabilities in SQLite before 3.8.10.2, as used in Apple iOS before 9, have unknown impact and a

CVE-2019-8457 CRITICAL
9.8 May 30

SQLite3 from 3.6.0 to and including 3.27.2 is vulnerable to heap out-of-bound read in the rtreenode() function when hand

CVE-2022-35737 HIGH POC
7.5 Aug 03

SQLite 1.0.12 through 3.39.x before 3.39.2 sometimes allows an array-bounds overflow if billions of bytes are used in a

CVE-2017-10989 CRITICAL
9.8 Jul 07

The getNodeSize function in ext/rtree/rtree.c in SQLite through 3.19.3, as used in GDAL and other products, mishandles u

CVE-2025-6965 HIGH POC
7.2 Jul 15

Memory corruption in SQLite versions before 3.50.2 allows network-based attackers with low privileges to manipulate aggr

CVE-2019-5018 HIGH POC
8.1 May 10

An exploitable use after free vulnerability exists in the window function functionality of Sqlite3 3.26.0. Rated high se

CVE-2025-71316 CRITICAL POC
9.2 Jun 04

Arbitrary DLL loading in SQLite's sqldiff.exe utility on Windows allows attackers to achieve code execution by abusing t

CVE-2026-11822 MEDIUM POC
6.8 Jun 09

Memory corruption in SQLite versions before 3.53.2 enables attackers to crash processes, exhaust memory, or potentially

CVE-2020-13871 HIGH POC
7.5 Jun 06

SQLite 3.32.2 has a use-after-free in resetAccumulator in select.c because the parse tree rewrite for window functions i

CVE-2020-11655 HIGH POC
7.5 Apr 09

SQLite through 3.31.1 allows attackers to cause a denial of service (segmentation fault) via a malformed window-function

CVE-2021-36690 HIGH POC
7.5 Aug 24

A segmentation fault can occur in the sqlite3.exe command-line component of SQLite 3.36.0 via the idxGetTableInfo functi

CVE-2026-87016 HIGH POC
8.1 Sep 09

OAuth and SCIM identity confusion in Open WebUI 0.6.41-0.10.x (SQLite-backed deployments only) allows unauthenticated re

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy