### Resumo O limite de taxa `authentification` usado para os pontos de checkpoints de login e de dois fatores aplica um único balde global compartilhado por cada cliente, em vez de teclado por IP ou por conta. Um atacante não autenticado enviando ~ 10 solicitações por minuto de um IP exausta o balde compartilhado e causa HTTP 429 para cada usuário em cada IP tentando fazer login ou completar 2 FA, enquanto o ataque for mantido. Esta é uma negação de serviço trivial, não autenticada, a nível do painel. ### Detalhes No `app/Provider/RouteServiceProvider::configureRateLimiting()` o limiter é definido como. ```php RateLimiter::for('authentification'), função (Petição $request) { if ($request->route()->named('auth.post.forgot-password')) { retorno Limita::perMinute( 2 )->por( $request->ip()); } Limitação de retorno::perMinute( 10 ); }); ```. O ramo de palavra-passe esquecida é corretamente delimitado com `->by($request->ip())`. O retorno decorrente, que cobre ` POST / auth/ login` e ` POST / auth/ login/ checkpoint` (veja `routes/ auth.php`, o grupo ` acelerador:autenticação`), omite completamente `->by()`.

Para um limitador nomeado, Laravel 11 deriva a chave cache como ` md 5 ($limiterName. $limit->key)` (`Illuminar\Encaminhar\Middleware\ThrottlePetições::handleRequestUsingNamedLimiter`). `Limite::perMinute( 10 )` é construído com uma tecla vazia, então a tecla resolvida é `md 5 ('autenticação')', uma constante idêntica para cada pedido entrante. Todos os clientes, portanto, disputam por um contador compartilhado em vez de um contador por fonte. Dois fatores pioram isto: - ` acelerador:authentication` é registrado como middleware de grupo em `routes/auth.php`, assim que ele aumenta antes do middleware de nível de rota `recaptcha` no `POST /auth/ login`. Os pedidos contam para o limite independentemente do resultado reCAPTCHA. - ` POST / auth/ login/ checkpoint` não tem reCAPTCHA, dando a um atacante uma forma limpa e de baixo custo para preencher o balde compartilhado com pedidos mal- formados. Uma vez que o 10 /minuto limite global é atingido, o acelerador retorna 429 para todas as solicitações subsequentes sobre esses endpoints até que a janela de um minuto desapareça. Repetir o rebento a cada minuto mantém o painel em um estado permanente bloqueado para todos os usuários legítimos.

### PoC 1. Levante um painel Pterodactilo padrão. 2. A partir de um único IP atacante, exaure o balde compartilhado através do ponto de checkpoint (sem reCAPTCHA): ````bash para i em $(seq 1 11 ); fazer curl -s -o /dev/null -w "% {http_code}\n" \ -X POST \ -H 'Content-Type: app/json' \ -H 'X-Pedido-Com: XMLHttpRequest' \ -d '{"Confirmation_token":"x","autentication_code":" 000000 "}" feito ``` Pedidos 1 - 10 devolve um normal 4 xx (validação/falha de auth); solicitação 11 devolve o ` 429 Muitos pedidos.

3. A partir de um IP completamente diferente e uma conta válida, tente um login normal: ```` bash curl -s -o /dev/null -w "%{http_code}\n" \ -X POST \ -H 'Content-Type: app/json' \ -H 'X-Pedido-Com: XMLHttpRequest' \ -d '{"user":"valid@exemplo.com","password":"correct-horse"} '````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````` Isto retorna ` 429 ` apesar de ser um IP diferente, conta diferente e credenciais válidas. Passo de looping 2 uma vez por minuto mantém todos os usuários bloqueados indefinidamente.

### Impacto Este é um ataque de disponibilidade não autenticado contra a autenticação. Qualquer painel Pterodactyl com face à internet pode ser inutilizável para todos os usuários (login e 2 Verificação de FA bloqueada) por um único atacante de banda baixa, sem credenciais, sem privilégios e sem interação do usuário. Os administradores estão bloqueados junto com usuários regulares, dificultando a resposta ao incidente. O objetivo da palavra-passe esquecida não é afetado porque está corretamente teclado por IP. Correção sugerida: tecla o limite de queda através da fonte do pedido, no mínimo: Limitação de retorno ``` php::perMinute( 10 )->by( $request->ip()); ```. Combinar idealmente o IP com o identificador enviado para o login (por exemplo, `->por($request->ip(). '. '' (string) $request->input(' user')') e o símbolo de confirmação IP mais para o ponto de checkpoint, assim a proteção por conta é preservada enquanto remove o balde global compartilhado.

### Aviso de responsabilidade Este relatório foi escrito pela IA, o próprio erro foi encontrado e confirmado pelo repórter. Registro de aconselhamento: GHSA-xvc 3 - 826 v- xf 47. Identificadores relacionados: CVE- 2026 - 61609.

Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 28 T 14: 57: 59.000 Z e lista a sua última modificação como 2026 - 07 - 28 T 14: 57: 59.000 Z. Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H.

Informações sobre software e versão afetadas: Pacote Packagist pterodactyl/panel — ECOSISTEM: introduzido 1.7.0, corrigido 1.13.0. Classificação e evidência: identificadores de fraqueza CWE- 770. O registro contém 2 suporte de referências nestes tipos: WEB, PACKAGE.