### Resumo Um caminho não autenticado atravessando o servidor de arquivos HTTP do LaunchServer (`FileServerHandler`) permite que qualquer ator remoto leia ** qualquer arquivo** legível pelo processo LaunchServer (por exemplo, `../.././././etc/passwd`). Este é um primitivo genérico de arquivo arbitrário- lido, então a correção deve abordar o próprio cruzamento, não qualquer arquivo específico. Os arquivos legíveis incluem os próprios segredos do servidor, que transformam isso da divulgação de informações em compromisso completo: a chave privada do ECDSA que assina o acesso aos JWTs (`.keys/ecdsa_id`), o sal de atualização (`.keys/legacySalt`), e `LaunchServer.json` (critérios de base de dados). Com a chave de assinatura, um atacante visa um token de acesso válido para qualquer conta, incluindo administradores. Isso é um bypass de autenticação completo. Pré-aut, configuração padrão, porta 9274. ** Afectado:** GravitLauncher Launcher Launcher LauncherServer ≤ 5.7.11 (o aplicativo LaunchServer; os artefatos `pro.gravit.launcher:*- api` Maven' publicados não contêm o código vulnerável.

### Detalhes em `FileServerHandler.canalRead 0 `. ````java path = Paths.get(IOHelper.getPathFromUrlFragment(uri)).normalize().toString().substring() 1 ); // linha 194 Arquivo arquivo = base.resolve( caminho).toFile(); // linha 200 - nenhum segundo normalizar() ``` ` substring( 1 )` cegamente tira uma barra de comando, assumindo que o alvo do pedido sempre começa com `/ '. O `HttpServerCodec` da Netty aceita um alvo de solicitação **sem** uma barra de texto (`decoderResult().isSuccess() == true`). Para tal alvo, `normalize()` não pode desfazer-se o `..', `substring( 1 ) ` transforma `../` em `./` (deixando o restante `...`), e `base.resolve(path)`, que não é re- normalizado, resolve ** fora** ` atualizaDir`.

`file.isHidden()` (linha) 201 ) é verificado apenas no componente de caminho final, assim os alvos que não começam com um ponto (`ecdsa_id`, `rsa_id`, `legacySalt`, `LaunchServer.json`) são servidos mesmo com ` showHiddenFiles=false`. O servidor de arquivos está ativado por padrão (`netty.fileServerEnabled=true`) e ligado a ` 0.0.0.0: 9274 `. Nenhum handler de auth precede `FileServerHandler`; `WebSocketServerProtocolHandler("/ api")` encaminha pedidos não- WebSocket / não- `/ api` até ele, então o ataque é um simples HTTP GET (sem WebSocket).

### PoC Reproduzido em uma compilação de fonte de v 5.7.11 (Lixa 4.2.12 ). ** Deve usar um socket bruto.** as bibliotecas curl/browsers/HTTP normalizam o caminho e prepend `/`, batendo no ramo seguro (falso "não reprodutível"). ``` 'imprimir 'GET.././.keys/ ecdsa_id HTTP/ 1.1 \r\nHost: x\r\n\r\n\n' Ì nc 9274 ```. Devolve os bytes de tecla privada do ECDSA bruto. Igual para `../../.keys/rsa_id`, `../../.keys/ legacySalt`, `../../LaunchServer.json`. `% 2 e% 2 e/...` (sem barra principal) também funciona. Profundidade- robusto arbitrário lê: `../../../../../../etc/passwd`. Controle (confirma a causa raiz): `GET /../../.keys/ecdsa_id` (CONTRO a barra principal) → 404. Apenas o formulário sem- líder- slash escapa.

### Impacto Leitura remota não autenticada de qualquer arquivo que o processo possa acessar. O que isso expõe: - `.keys/ecdsa_id`: a chave que assina acessar JWTs. Com ele, um atacante visa um token válido para qualquer conta, incluindo administradores, por isso este é um bypass de autenticação completo. - `.keys/legacySalt`: permite que um atacante forje tokens de atualização. - `LaunchServer.json`: credenciais de banco de dados. - Qualquer outro arquivo legível pelo processo (config, logs, arquivos de sistema). Nota de implantação: um L normalizando 7 o proxy inverso (stock nginx `location / { proxy_pass...; }`) rejeita o pedido de slash sem leading ( 400 ) e colapsa o curso de lunch- slash, bloqueando o vetor primário. Mas o encadernamento padrão é ` 0.0.0.0: 9274 `, assim a proteção depende da firewalling da porta do backend; L 4 /TCP proxys (HAProxy TCP, nginx `stream`, Espectro CF) e exposição direta permanecem exploráveis.

### Correção sugerida 1. Re- `normalize()` após `base.resolve(path)` e verifique `resolved.startsWith(base)`. 2. Rejeite os alvos de solicitação que não começam com `/ ` ( 400 ). 3. Ligação padrão para ` 127.0.0.1 `; armazenar `.keys` fora de `atualizaDir`. Registro de aconselhamento: GHSA- 5 g 75 - 477 J- 2 c 2 f. Identificadores relacionados: CVE- 2026 - 54617.

Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 02 T 20: 49: 18.000 Z e lista a sua última modificação como 2026 - 07 - 02 T 20: 49: 18.000 Z. Gravidade: Crítico. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H.

Software afetado e informações de versão: Maven pacote pro.gravit.launcher:launchserver-api — ECOSISTEM: introduzido 0, última afetada 5.7.11. Classificação e evidência: identificadores de fraqueza CWE- 200, CWE- 22, CWE- 522. O registro contém 2 suporte de referências nestes tipos: WEB, PACKAGE.