### Resumo Existe uma vulnerabilidade de escalada de privilégios no endpoint Wings /upload/file devido à validação insuficiente dos JWTs assinados pelo painel. Wings aceita qualquer JWT válido assinado pelo painel contendo `server_uuiid`, `user_uuid` e `unique_id`, independentemente do propósito pretendido pelo token. Como o Painel emite JWTs com estas mesmas reivindicações para outras operações de menores privilégios (como autenticação do WebSocket e links de download de arquivos), um subusuário autenticado pode reutilizar um desses tokens para carregar arquivos arbitrários sem possuir a permissão necessária `file.create`. ### Impactar Qualquer subusuário com permissão para se conectar ao console de um servidor, baixar arquivos ou baixar backups pode reutilizar esses símbolos para carregar arquivos arbitrários para o _meme server_. Um usuário que não tenha acesso a um servidor como sub- usuário não é capaz de carregar arquivos arbitrariamente.
### Detalhes O painel gerou tokens JWT para vários propósitos: - 0 f 82 c 105201 b 192 d 229 f 6 Abd 5827 e 2 ee 7 e 672 a 05 /app/Services/Backups/DownloadLinkService.php#L 33 - L 36 - 0 f 82 c 105201 b 192 d 229 f 6 Abd 5827 e 2 ee 7 e 672 a 05 /app/Http/Controllers/Api/Client/Servers/FileUploadController.php#L 45 - 0 f 82 c 105201 b 192 d 229 f 6 Abd 5827 e 2 ee 7 e 672 a 05 /app/Http/Controllers/Api/Client/Servers/WebsocketController.php#L 58 - L 61 - 0 f 82 c 105201 b 192 d 229 f 6 Abd 5827 e 2 ee 7 e 672 a 05 /app/Http/Controllers/Api/Client/Servers/FileController.php#L 82 - L 85 Embora o propósito real não seja transmitido como parte dos tokens do JWT, isto introduz esta vulnerabilidade de poder fazer ações não pretendidas devido aos campos esperados (ou seja, `server_ uuid`) na maioria dos endpoints sendo os mesmos quando analisando- o no lado das asas. ### PoC Crie um novo subusuário que tenha a quantidade mínima de permissões em um servidor (`websocket.connect`). Como aquele sub- usuário, recupere um token do Websocket JWT do endpoint `GET /api/client/servers/[...]/websocket` (no meu caso, eu manualmente faço apenas um pedido sob a sessão do navegador do usuário; você provavelmente pode simplesmente reenviar o pedido do /websocket no console do navegador para obter um token novo não utilizado). Usando esse token websocket, podemos abusar disso usando- o diretamente no ponto final `/upload/file` do nó das asas em vez de usá-lo para autenticação websocket: ```python 3 importar pedidos.
wings_url = ' 8080 ' websocket_ token = '[...]'. res = requests.post(f'{wings_url}/upload/ file', params = { 'token': websocket_token, }, files = { 'files': ('file-upload.txt', b' Olá, World!'), }) print( res.status_code, res.content) ```` Observar, que, embora o nosso subusuário nunca tenha permissões fora de visualizar o console, eles são capazes de escrever arquivos arbitrários no servidor. Este padrão acontece em muitas outras ações, mas este provavelmente é o mais interessante. Registro de aconselhamento: GHSA- 8 r 6 w- 3 qq 5 - 4 p 4 r. Identificadores relacionados: CVE- 2026 - 54593.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 28 T 15: 43: 25.000 Z e lista a sua última modificação como 2026 - 07 - 28 T 15: 43: 25.000 Z.
Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H.
Informações sobre software e versão afetadas: Pacote Packagist pterodactyl/panel — ECOSISTEM: introduzido 0, corrigido 1.12.3. Go pacote github.com/ pterodactyl/wings — ECOSISTEM: introduzido 0, corrigido 1.12.2.
Classificação e evidência: identificadores de fraqueza CWE- 1259, CWE- 1270. O registro contém 5 suporte de referências nestes tipos: WEB, PACKAGE.