CVE-2026-55500
9router: Exposure of Sensitive Information and Unprotected Database Import/Export Allows Complete Credential Theft and Database Takeover
9Router is an AI router & token saver. Prior to 0.4.80, the /api/settings/database endpoint allows full database export (containing all credentials, API keys, OAuth tokens, and settings) and full database import (complete overwrite) without any authentication requirement beyond the ALWAYS_PROTECTED middleware check, which only validates JWT or CLI token. This issue is fixed in version 0.4.80.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
9.9
9router: Exposure of Sensitive Information and Unprotected Database Import/Export Allows Complete Credential Theft and Database Takeover
9Router is an AI router & token saver. Prior to 0.4.80, the /api/settings/database endpoint allows full database export (containing all credentials, API keys, OAuth tokens, and settings) and full database import (complete overwrite) without any authentication requirement beyond the ALWAYS_PROTECTED middleware check, which only validates JWT or CLI token. This issue is fixed in version 0.4.80.
- Record
CVE-2026-55500- CVSS 3.1
- 9.9 Critical
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-200
- Updated
- 2026-11-02
EUVDEUVD-2026-42928
9.9
9Router is an AI router & token saver. Prior to 0.4.80, the /api/settings/database endpoint allows full database export (containing all credentials, API keys, OAuth tokens, and settings) and full database import (complete overwrite) without any authentication requirement beyond the ALWAYS_PROTECTED middleware check, which only validates JWT or CLI token. This issue is fixed in version 0.4.80.
- Record
EUVD-2026-42928- CVSS 3.1
- 9.9 Critical
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-qvfm-67h2-2qfx
9.9
9routers has Exposure of Sensitive Information and Unprotected Database Import/Export, Allowing Complete Credential Theft and Database Takeover
Summary
The /api/settings/database endpoint allows full database export (containing all credentials, API keys, OAuth tokens, and settings) and full database import (complete overwrite) without any authentication requirement beyond the ALWAYS_PROTECTED middleware check, which only validates JWT or CLI token. Combined with other vulnerabilities (e.g., default password, tunnel exposure), this enables complete database takeover.
Description
The endpoint /api/settings/database is listed in ALWAYS_PROTECTED in dashboardGuard.js (line 42), which requires a valid JWT token or CLI token. However, this protection is insufficient because:
-
GET (Export): Returns the complete database including API keys (
keyfield inapiKeystable), OAuth tokens, and all provider credentials. Line 80 insrc/lib/db/index.js:apiKeys: db.all("SELECT * FROM apiKeys").map(...)— thekeyfield contains the plaintext API key value. -
POST (Import): Accepts arbitrary JSON and performs a complete database wipe-and-replace in a transaction (lines 102-163 in
src/lib/db/index.js). This replaces all settings including the password hash, effectively allowing an attacker to set their own password. -
The exported data includes
apiKeyswith their plaintextkeyvalues,providerConnectionswith all OAuth tokens, andsettingswith OIDC client secrets.
Evidence
File: src/app/api/settings/database/route.js
export async function GET() {
const payload = await exportDb();
return NextResponse.json(payload);
}
export async function POST(request) {
const payload = await request.json();
await importDb(payload);
// ...
}
File: src/lib/db/index.js (lines 96-163)
export async function importDb(payload) {
db.transaction(() => {
// Wipe all tables
db.run(`DELETE FROM settings`);
db.run(`DELETE FROM providerConnections`);
db.run(`DELETE FROM providerNodes`);
db.run(`DELETE FROM proxyPools`);
db.run(`DELETE FROM apiKeys`);
db.run(`DELETE FROM combos`);
db.run(`DELETE FROM kv WHERE scope IN (...)`);
// Then insert attacker-controlled data
// ...
});
}
The exportDb function at line 80 exposes API key plaintext:
apiKeys: db.all(`SELECT * FROM apiKeys`).map((r) => ({
id: r.id, key: r.key, name: r.name, ...
})),
Steps to Reproduce
- Authenticate with any valid JWT (e.g., using the default password "123456")
- Export:
curl -b auth_token=<jwt> http://localhost:20128/api/settings/database - Observe: Full database dump with all credentials in plaintext
- Import malicious data:
curl -X POST -b auth_token=<jwt> -H "Content-Type: application/json" -d '<modified-db>' http://localhost:20128/api/settings/database - All settings, passwords, API keys are now replaced with attacker-controlled values
Impact
- Confidentiality: Complete exposure of all stored secrets (API keys, OAuth tokens, OIDC client secrets)
- Integrity: Complete database replacement with attacker-controlled data
- Availability: Database wipe is possible by importing an empty database
- Scope Changed: Importing new settings affects all users and downstream services
Recommended Fix
- Require re-authentication for database export/import (not just an existing session)
- Mask/redact API keys in export (or require explicit opt-in for key export)
- Add confirmation step for import (require current password verification)
- Implement database backup before import
- Log all export/import operations with audit trail
- Record
GHSA-qvfm-67h2-2qfx- CVSS 3.1
- 9.9 Critical
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-200
- Updated
- 2026-11-02
NVD
9.9
9Router is an AI router & token saver. Prior to 0.4.80, the /api/settings/database endpoint allows full database export (containing all credentials, API keys, OAuth tokens, and settings) and full database import (complete overwrite) without any authentication requirement beyond the ALWAYS_PROTECTED middleware check, which only validates JWT or CLI token. This issue is fixed in version 0.4.80.
- Record
CVE-2026-55500- CVSS 3.1
- 9.9 Critical
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-200
- Updated
- 2026-11-02
OSV
9.9
9router: Exposure of Sensitive Information and Unprotected Database Import/Export Allows Complete Credential Theft and Database Takeover
9Router is an AI router & token saver. Prior to 0.4.80, the /api/settings/database endpoint allows full database export (containing all credentials, API keys, OAuth tokens, and settings) and full database import (complete overwrite) without any authentication requirement beyond the ALWAYS_PROTECTED middleware check, which only validates JWT or CLI token. This issue is fixed in version 0.4.80.
- Record
CVE-2026-55500- CVSS 3.1
- 9.9 Critical
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-200
- Updated
- 2026-11-02
OSVGHSA-qvfm-67h2-2qfx
9.9
9routers has Exposure of Sensitive Information and Unprotected Database Import/Export, Allowing Complete Credential Theft and Database Takeover
Summary
The /api/settings/database endpoint allows full database export (containing all credentials, API keys, OAuth tokens, and settings) and full database import (complete overwrite) without any authentication requirement beyond the ALWAYS_PROTECTED middleware check, which only validates JWT or CLI token. Combined with other vulnerabilities (e.g., default password, tunnel exposure), this enables complete database takeover.
Description
The endpoint /api/settings/database is listed in ALWAYS_PROTECTED in dashboardGuard.js (line 42), which requires a valid JWT token or CLI token. However, this protection is insufficient because:
-
GET (Export): Returns the complete database including API keys (
keyfield inapiKeystable), OAuth tokens, and all provider credentials. Line 80 insrc/lib/db/index.js:apiKeys: db.all("SELECT * FROM apiKeys").map(...)— thekeyfield contains the plaintext API key value. -
POST (Import): Accepts arbitrary JSON and performs a complete database wipe-and-replace in a transaction (lines 102-163 in
src/lib/db/index.js). This replaces all settings including the password hash, effectively allowing an attacker to set their own password. -
The exported data includes
apiKeyswith their plaintextkeyvalues,providerConnectionswith all OAuth tokens, andsettingswith OIDC client secrets.
Evidence
File: src/app/api/settings/database/route.js
export async function GET() {
const payload = await exportDb();
return NextResponse.json(payload);
}
export async function POST(request) {
const payload = await request.json();
await importDb(payload);
// ...
}
File: src/lib/db/index.js (lines 96-163)
export async function importDb(payload) {
db.transaction(() => {
// Wipe all tables
db.run(`DELETE FROM settings`);
db.run(`DELETE FROM providerConnections`);
db.run(`DELETE FROM providerNodes`);
db.run(`DELETE FROM proxyPools`);
db.run(`DELETE FROM apiKeys`);
db.run(`DELETE FROM combos`);
db.run(`DELETE FROM kv WHERE scope IN (...)`);
// Then insert attacker-controlled data
// ...
});
}
The exportDb function at line 80 exposes API key plaintext:
apiKeys: db.all(`SELECT * FROM apiKeys`).map((r) => ({
id: r.id, key: r.key, name: r.name, ...
})),
Steps to Reproduce
- Authenticate with any valid JWT (e.g., using the default password "123456")
- Export:
curl -b auth_token=<jwt> http://localhost:20128/api/settings/database - Observe: Full database dump with all credentials in plaintext
- Import malicious data:
curl -X POST -b auth_token=<jwt> -H "Content-Type: application/json" -d '<modified-db>' http://localhost:20128/api/settings/database - All settings, passwords, API keys are now replaced with attacker-controlled values
Impact
- Confidentiality: Complete exposure of all stored secrets (API keys, OAuth tokens, OIDC client secrets)
- Integrity: Complete database replacement with attacker-controlled data
- Availability: Database wipe is possible by importing an empty database
- Scope Changed: Importing new settings affects all users and downstream services
Recommended Fix
- Require re-authentication for database export/import (not just an existing session)
- Mask/redact API keys in export (or require explicit opt-in for key export)
- Add confirmation step for import (require current password verification)
- Implement database backup before import
- Log all export/import operations with audit trail
- Record
GHSA-qvfm-67h2-2qfx- CVSS 3.1
- 9.9 Critical
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-200
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
9routernpm |
through 0.4.71 | None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-55500 is a critical vulnerability (CVSS 9.9) in Decolua 9router, published July 6, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.48%, the 41st percentile. No source names a fixed version.
References
github.com/decolua/9router/security/advisories/GHSA-qvfm-67h2-2qfx
github.com/decolua/9router/commit/0c7c9de00ae3ab81d6580e3cc368483c4c03f6fd
github.com/decolua/9router/releases/tag/v0.4.80
github.com/advisories/GHSA-qvfm-67h2-2qfx
github.com/CVEProject/cvelistV5/tree/main/cves/2026/55xxx/CVE-2026-55500.json
nvd.nist.gov/vuln/detail/CVE-2026-55500
github.com/decolua/9router