CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-25892

Adminer CVE-2026-25892: The Self-Destructing Version Check

Alon Barad
Alon Barad
Software Engineer

Feb 10, 2026·5 min read·180 visits

Executive Summary (TL;DR)

Unauthenticated DoS in Adminer versions < 5.4.2. An attacker can send a POST request with `version[]` to the `?script=version` endpoint. This saves a serialized array to a temp file. On the next page load, PHP 8 crashes when trying to pass that array to `openssl_verify()`, effectively killing the Adminer instance.

Adminer, the popular single-file database management tool, contains a logic flaw in its update mechanism that allows unauthenticated attackers to persistently brick the application. By feeding a malformed array to the version check endpoint, an attacker can trick the server into serializing 'poisoned' data to disk. When the application attempts to verify this data on subsequent requests, it triggers a fatal PHP 8 TypeError, causing a Denial of Service (DoS) for all users until the temporary file is manually deleted.

The Hook: One File to Rule Them All

Adminer is the darling of PHP developers everywhere. It's a lightweight, single-file alternative to the bloated beast that is phpMyAdmin. You drop adminer.php onto your server, and boom—you have full database management. Its simplicity is its selling point. But as we see time and time again in security, 'simple' implementation often skips the 'complex' validation steps necessary to keep the bad guys out.

This specific vulnerability targets a feature that was supposed to be helpful: the automatic version check. The idea was innocent enough—notify the admin if their version of Adminer is outdated. However, the implementation committed a cardinal sin of web development: it trusted unauthenticated user input, serialized it, and wrote it to the local filesystem. This created a pathway for any random person on the internet to plant a landmine in the server's temporary directory.

What makes this bug particularly amusing (in a dark way) is that it doesn't leak data or execute code. It just throws a tantrum. It exploits the strictness of modern PHP against the laziness of legacy code, turning a helper feature into a global kill switch for the application.

The Flaw: Serializing the Unknown

Let's look at where things went wrong. In adminer/include/bootstrap.inc.php, there is a block of code listening for the ?script=version query parameter. This endpoint is accessible to anyone—no login required. Its job is to receive a version string and a signature, then cache them locally so the server doesn't have to constantly query the upstream update server.

Here is the offending code snippet:

if ($_GET["script"] == "version") {
    $filename = get_temp_dir() . "/adminer.version";
    $fp = file_open_lock($filename);
    if ($fp) {
        // VULNERABLE: blindly serializing $_POST input
        file_write_unlock($fp, serialize(array(
            "signature" => $_POST["signature"], 
            "version" => $_POST["version"]
        )));
    }
    exit;
}

Notice the complete lack of type hints or validation? The code assumes $_POST['version'] is a string. But this is PHP. If I send version[]=1, PHP kindly converts that into an array. The serialize() function doesn't care; it happily serializes the array and writes it to adminer.version. The trap is set.

The Trigger: A Fatal Sip of Poison

The trap is sprung in adminer/include/design.inc.php, which runs every time a user loads a page to render the UI. It reads the cached file, unserializes it, and tries to verify the signature using openssl_verify.

$filename = get_temp_dir() . "/adminer.version";
if (file_exists($filename)) {
    $version = unserialize(file_get_contents($filename));
    // ... key setup ...
    
    // CRASH LANDING
    if (openssl_verify($version["version"], base64_decode($version["signature"]), $public)) {
        // ...
    }
}

In older versions of PHP (7.x), passing an array to a function expecting a string might just emit a warning and return false. The app would limp along. But PHP 8 stopped messing around. It introduced strict typing for internal functions. When openssl_verify receives an array as the first argument instead of a string, it throws a fatal TypeError.

Because design.inc.php is part of the core bootstrap process, this uncaught exception bubbles up and kills the entire script. The result? A confusing HTTP 500 error for every single user trying to access the database manager. The 'Persistent' part of this DoS is key—it doesn't go away until the temp file is physically deleted by an admin with shell access.

The Exploit: Nuking from Orbit

Exploiting this is trivially easy. You don't need a browser; you just need curl. The goal is to send a POST request that forces PHP to interpret the version parameter as an array. We do this by appending brackets [] to the parameter name.

Here is the kill command:

curl -X POST "http://target-server/adminer.php?script=version" \
     -d "version[]=ha_ha_business" \
     -d "signature=irrelevant"

That's it. One request. The server processes it, serializes the array into /tmp/adminer.version (or wherever sys_get_temp_dir() points), and the application is now dead.

This is a classic 'Griefing' vulnerability. It's not going to get you a shell (unless there's some wildly obscure gadget chain in the unserialize logic, which is unlikely here given the limited scope), but it effectively locks the admins out of their own database tools. In a crisis scenario where an admin needs to fix a DB issue right now, this DoS could be catastrophic.

The Fix: If It Hurts, Stop Doing It

The vendor, Jakub Vrána, fixed this in version 5.4.2 by realizing that server-side caching of version data was a bad idea to begin with. The patch didn't just add input validation; it ripped out the entire mechanism.

In the new version, the server-side ?script=version endpoint is gone. The openssl_verify logic in the PHP backend is gone. Instead, the application now uses a JavaScript fetch call in the browser to check for updates. This moves the trust boundary to the client, where it belongs for this kind of feature.

> [!NOTE] > Manual Remediation: If you can't upgrade immediately, you must delete the adminer.version file from your system's temp directory and block access to ?script=version via your web server config (Nginx/Apache).

Official Patches

AdminerAdminer 5.4.2 Release Notes

Fix Analysis (1)

Technical Appendix

CVSS Score
7.5/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

Affected Systems

Adminer

Affected Versions Detail

Product
Affected Versions
Fixed Version
Adminer
vrana
>= 4.6.2 < 5.4.25.4.2
AttributeDetail
CWE IDCWE-20 (Improper Input Validation)
Attack VectorNetwork
CVSS7.5 (High)
ImpactDenial of Service (Persistent)
Exploit StatusPoC Available
LanguagePHP 8.x

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
T1499.003Application or System Exploitation
Impact
CWE-20
Improper Input Validation

Known Exploits & Detection

ManualcURL command to inject array into version parameter

Vulnerability Timeline

Vulnerability identified and patched in version 5.4.2
2023-01-01

References & Sources

  • [1]GHSA-q4f2-39gr-45jh: Unauthenticated DoS
  • [2]Adminer Official Site

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•35 minutes ago•CVE-2026-108258
6.9

CVE-2026-108258: Path Traversal in Shiny for Python Bookmark Restoration

A path traversal vulnerability in Shiny for Python (posit-dev/py-shiny) versions 1.4.0 through 1.6.3 allows unauthenticated remote attackers to read arbitrary files and traverse directories via crafted _state_id_ query parameters.

Alon Barad
Alon Barad
0 views•4 min read
•about 2 hours ago•CVE-2026-108260
7.6

CVE-2026-108260: Stored Cross-Site Scripting (XSS) in @tinacms/web-components

A Stored Cross-Site Scripting vulnerability in @tinacms/web-components prior to version 0.2.1 allows low-privileged content authors to execute arbitrary JavaScript code in the context of website visitors via unsanitized URL attributes in custom Markdown rendering components.

Alon Barad
Alon Barad
1 views•5 min read
•about 3 hours ago•CVE-2026-108261
9.3

CVE-2026-108261: Admin Preview Cross-Origin Bypass and GraphQL Hijacking in TinaCMS

A critical origin validation flaw in TinaCMS admin preview allows unauthenticated attackers to bypass cross-origin postMessage checks and execute unauthorized GraphQL queries and mutations under an authenticated editor's context.

Alon Barad
Alon Barad
5 views•5 min read
•about 4 hours ago•CVE-2026-108259
8.2

CVE-2026-108259: Code Injection in @tinacms/cli via Unsanitized Git Branch Name Interpolation

@tinacms/cli prior to version 3.0.0 dynamically constructs client source files using string interpolation without properly sanitizing runtime configuration variables. An attacker with permissions to create a branch or pull request can inject arbitrary JavaScript statements via a crafted Git ref name, leading to execution during automated build processes.

Amit Schendel
Amit Schendel
8 views•5 min read
•about 5 hours ago•CVE-2026-107804
5.3

CVE-2026-107804: Client IP Resolution Flaw & Authentication Lockout in Nginx UI

Nginx UI versions 2.2.0 through 2.5.10 fail to properly configure Gin framework trusted proxies when deployed behind a reverse proxy. This causes all incoming HTTP requests to be attributed to the loopback IP (127.0.0.1), enabling IP allowlist bypass and global authentication lockouts.

Amit Schendel
Amit Schendel
6 views•5 min read
•about 6 hours ago•CVE-2026-107805
7.5

CVE-2026-107805: Unauthenticated Storage Exhaustion in Nginx UI Node Authentication

Nginx UI versions 2.5.0 through 2.5.10 contain an uncontrolled resource consumption vulnerability in the node authentication handler. Unauthenticated remote attackers can exhaust host disk storage and I/O resources by submitting large HTTP request bodies to node-signature endpoints prior to cryptographic signature validation.

Alon Barad
Alon Barad
4 views•6 min read