CVE-2026-107382 Overview
CVE-2026-107382 is a denial-of-service vulnerability in the MariaDB Connector/Node.js client library. The flaw exists in versions 3.3.0 through 3.5.3 and resides in the zero-configuration TLS fingerprint-validation path. The Ed25519PasswordAuth.hash() function references a seed identifier that is not in scope, causing a synchronous ReferenceError to escape the socket data handler. Under default Node.js uncaught-exception behavior, the client process terminates. A legitimate server, malicious server, or network attacker presenting a self-signed certificate can trigger this condition when client_ed25519 is negotiated as the authentication plugin. The issue is tracked under [CWE-248] (Uncaught Exception) and fixed in version 3.5.4.
Critical Impact
Client processes using MariaDB Connector/Node.js terminate when the vulnerable authentication path is reached, causing application-level denial of service.
Affected Products
- MariaDB Connector/Node.js versions 3.3.0 through 3.5.3
- Node.js applications connecting to MariaDB/MySQL databases over TCP with TLS enabled
- Deployments using client_ed25519 authentication plugin without a configured ssl.ca
Discovery Timeline
- 2026-10-08 - CVE-2026-107382 published to the National Vulnerability Database
- 2026-10-08 - Last updated in NVD database
Technical Details for CVE-2026-107382
Vulnerability Analysis
The vulnerability resides in lib/cmd/handshake/auth/ed25519-password-auth.js within the MariaDB Connector/Node.js library. During zero-configuration TLS fingerprint validation, the client invokes Ed25519PasswordAuth.hash() through Authentication.validateFingerPrint. The hash() function references a seed variable that is not available in its lexical scope. The reference triggers a synchronous ReferenceError inside the socket data handler. Node.js propagates the uncaught exception to the top of the event loop, which terminates the process under default behavior. This classifies as [CWE-248] Uncaught Exception.
Root Cause
The root cause is a missing identifier binding in the Ed25519 signing routine. The refactored code expected a seed value to be in scope when computing the signed message, but the zero-configuration TLS path called hash() without providing it. The patch restructures the function to derive the private scalar through a dedicated privateScalar(password) helper and reorganizes variable declarations so required inputs are available in scope.
Attack Vector
Exploitation requires a specific set of preconditions: a MariaDB server reached over TCP, TLS enabled with ssl: true or an ssl object where rejectUnauthorized is not false, a password set, no ssl.ca configured, and the server negotiating client_ed25519 as the authentication plugin. When these conditions align, any party presenting a self-signed certificate — a legitimate server, a malicious server, or a network attacker performing a man-in-the-middle attack — can trigger the ReferenceError. Configurations using a provided CA, rejectUnauthorized: false, a different authentication plugin, or a Unix socket do not reach the vulnerable path.
if (!password) return Buffer.alloc(0);
let i, j;
- let p = [gf(), gf(), gf(), gf()];
+ const p = [gf(), gf(), gf(), gf()];
const signedMsg = Buffer.alloc(96);
- const bytePwd = Buffer.from(password);
- // Ed25519 signing per RFC 8032: SHA-512 of the password derives the private scalar
- // (clamped below). Protocol-mandated, not password-at-rest storage, so a slow KDF
- // (bcrypt/scrypt/argon2) does not apply.
- let hash = Crypto.createHash('sha512');
- // codeql[js/insufficient-password-hash]
- const d = hash.update(bytePwd).digest();
- d[0] &= 248;
- d[31] &= 127;
- d[31] |= 64;
+ const d = privateScalar(password);
for (i = 0; i < 32; i++) signedMsg[64 + i] = seed[i];
for (i = 0; i < 32; i++) signedMsg[32 + i] = d[32 + i];
- hash = Crypto.createHash('sha512');
+ let hash = Crypto.createHash('sha512');
const r = hash.update(signedMsg.subarray(32, 96)).digest();
Source: GitHub Commit 784ca3d. The patch refactors scalar derivation into privateScalar() and corrects the scope so the signing routine executes without ReferenceError.
Detection Methods for CVE-2026-107382
Indicators of Compromise
- Unexpected Node.js process termination logs referencing ReferenceError: seed is not defined originating from ed25519-password-auth.js
- Repeated application restarts or crash-loop behavior following outbound TLS connections to MariaDB on TCP port 3306
- TLS handshake traces showing self-signed certificates presented by hosts negotiating the client_ed25519 authentication plugin
Detection Strategies
- Inventory Node.js applications and parse package-lock.json or yarn.lock for mariadb dependency versions between 3.3.0 and 3.5.3
- Monitor process supervisors (systemd, PM2, Kubernetes) for abnormal exit codes from applications that connect to MariaDB over TLS
- Capture and review stderr output for stack traces referencing Authentication.validateFingerPrint and Ed25519PasswordAuth.hash
Monitoring Recommendations
- Alert on Node.js uncaught-exception events correlated with outbound connections to database endpoints
- Baseline the authentication plugins negotiated by MariaDB clients and flag unexpected client_ed25519 negotiations
- Track TLS certificate changes on database hosts to detect substitution with self-signed certificates that could trigger the vulnerable path
How to Mitigate CVE-2026-107382
Immediate Actions Required
- Upgrade MariaDB Connector/Node.js to version 3.5.4 or later across all affected applications
- Audit connection strings and configurations for use of ssl: true without a configured ssl.ca
- Validate that database servers present certificates issued by a trusted CA pinned via ssl.ca
Patch Information
The fix is available in MariaDB Connector/Node.js version 3.5.4. Refer to the GitHub Release 3.5.4, the GitHub Security Advisory GHSA-cx2f-j9fh-8g68, and MariaDB JIRA Issue CONJS-356 for additional detail.
Workarounds
- Configure an explicit ssl.ca with the trusted certificate authority so the zero-configuration fingerprint path is not executed
- Switch to a non-Ed25519 authentication plugin such as mysql_native_password on the server side
- Use a Unix socket connection instead of TCP where the client and server reside on the same host
# Upgrade MariaDB Connector/Node.js to the patched release
npm install mariadb@3.5.4
# Example connection configuration with explicit CA (not the vulnerable path)
# const conn = await mariadb.createConnection({
# host: 'db.example.com',
# user: 'app',
# password: process.env.DB_PASSWORD,
# ssl: { ca: fs.readFileSync('/etc/ssl/certs/mariadb-ca.pem') }
# });
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

