Severity by source
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
Single unauthenticated remote request (AV:N/AC:L/PR:N/UI:N) resets admin credentials granting full read/write control (C:H/I:H); no direct availability destruction primitive, so A:N, consistent with the vendor's VA:N.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
4DescriptionCVE.org
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.
AnalysisAI
Authentication bypass in Qinglong (whyour/qinglong) task-management platform before 2.20.1 lets an unauthenticated remote attacker reset administrator credentials on an already-initialized instance by sending PUT /open/user/init. The flaw stems from a path-rewrite ordering mistake: the init-guard middleware whitelists /open/* through JWT auth, then rewrites it to /api/user/init after the guard's initialization check has already been bypassed. No public exploit identified at time of analysis, but the fixing PR diff publicly discloses the exact bypass, making weaponization trivial; CVSS 4.0 base score is 9.3 (Critical).
Technical ContextAI
Qinglong is a self-hosted cron/timed-task scheduler (Node.js/Express backend, back/loaders/express.ts) that runs user scripts in Python3, JavaScript, Shell, and TypeScript. The affected component is the Express init-guard middleware combined with an internal URL rewrite rule rewrite('/open/*', '/api/$1'). The guard intended to allow the one-time user-initialization endpoint only while an instance is uninitialized by exempting '/api/user/init' (and '/api/user/notification/init') from the 'already-initialized' block. However, the /open/* namespace is whitelisted for JWT-authenticated open-API access and is only rewritten to the /api/* form AFTER both JWT auth and the init guard have run, so the guard never recognizes '/open/user/init' as the initialization path and fails to enforce the initialized-state check on it. This is a classic CWE-287 (Improper Authentication) issue rooted in inconsistent path normalization / middleware ordering - the security decision is made on the pre-rewrite path while the sensitive handler is reached via the post-rewrite path. Per CPE cpe:2.3:a:whyour:qinglong:*, all versions prior to 2.20.1 are affected.
RemediationAI
Vendor-released patch: 2.20.1 - upgrade all Qinglong instances to 2.20.1 or later, which extends the init-guard whitelist check to include '/open/user/init' and '/open/user/notification/init' and evaluates it against req.path so the rewritten open-API paths are also blocked on initialized instances (see PR #2941 and advisory GHSA-v667-gc2r-2xm7). If you cannot immediately upgrade, place the instance behind a reverse proxy or WAF and block or deny external requests to the /open/user/init and /open/user/notification/init paths (and the /api equivalents), since a legitimately initialized instance never needs the init endpoints reachable from untrusted networks; the trade-off is that any tooling relying on the open API through that proxy must be re-tested. As a further compensating control, restrict network exposure of the Qinglong web/API port to trusted management networks or a VPN, accepting the loss of direct internet access to the panel. After patching, rotate the administrator credentials and audit for unexpected account resets or newly added tasks/scripts, since credential takeover enables arbitrary script execution.
Same weakness CWE-287 – Improper Authentication
View allSame technique Authentication Bypass
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-44820
GHSA-v667-gc2r-2xm7