> ## Content Index
> Fetch the complete content index at: https://yokai.hakaisecurity.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# [PT] CVE-2026-114509: Bypass de Autenticação no Laravel TokenGuard
- URL: https://yokai.hakaisecurity.io/pt-ghsa-f9x3-7vq9-cph6-bypass-de-autenticacao-no-laravel-tokenguard/
- Published: 2026-10-20T14:13:10.000Z
- Updated: 2026-10-26T16:37:27.000Z
- Author: Gabriel Rodrigues
- Tags: pt-br, Research Blog, #pair-tok

## Resumo

A equipe da Yokai Research analisou em detalhes e desenvolveu uma prova de conceito para uma vulnerabilidade crítica de desvio de autenticação no Laravel (identificada como GHSA-f9x3-7vq9-cph6). A falha ocorre no *TokenGuard* o mecanismo nativo responsável pela proteção de rotas `auth:api`. Ela foi descoberta por [KIKOmanasijev ](https://github.com/KIKOmanasijev?ref=yokai.hakaisecurity.io)e reportada via GitHub Security Advisory. 

Com severidade **9.2 (Crítica)** no CVSS v4, a vulnerabilidade afeta o Laravel nas versões **anteriores a 13.29.0 e 12.68.0**. Caso a tabela de usuários da aplicação utilize **MySQL ou MariaDB**, um invasor sem credenciais consegue se autenticar como qualquer usuário cadastrado **sem precisar de um token válido** basta enviar uma única requisição customizada para qualquer rota protegida. 

Após a notificação, Taylor Otwell, criador do Laravel, lançou as correções entre 24 e 25 de agosto de 2026 commits [9b21ce0a9bb](https://github.com/laravel/framework/commit/9b21ce0a9bb2b2599978bc0b0df4abea952ad31c?ref=yokai.hakaisecurity.io), [8dbb08bc](https://github.com/laravel/framework/commit/8dbb08bccac1be095dba4a9d259a419620f1e8a5?ref=yokai.hakaisecurity.io), [5056ca53](https://github.com/laravel/framework/commit/5056ca53797eed9244749695c3bb3f015a38415c?ref=yokai.hakaisecurity.io), e o alerta oficial foi publicado em 19 de outubro de 2026\. Este artigo traz uma análise aprofundada da causa raiz, a comparação do código antes e depois do ajuste, além de um ambiente de teste (*lab*) reproduzível e o *exploit* funcional.

## **Detalhes Técnicos**

A vulnerabilidade explora a falta de uma validação de tipos nas credenciais de autenticação, combinada com a forma como o MySQL e o MariaDB realizam a conversão automática de tipos (*type coercion*) ao comparar colunas de texto (*string*) com valores inteiros.

A lógica vulnerável fica no arquivo `src/Illuminate/Auth/TokenGuard.php`, mais especificamente nos métodos `user()` (linha 70) e `validate()` (linha 111). O código anterior à correção pode ser consultado no histórico da versão [original](https://github.com/laravel/framework/blob/0189a60b261bbd94bffe21bba4e43323cf6af051/src/Illuminate/Auth/TokenGuard.php?ref=yokai.hakaisecurity.io#L70-L120), bem como a sua versão [corrigida](https://github.com/laravel/framework/blob/9b21ce0a9bb2b2599978bc0b0df4abea952ad31c/src/Illuminate/Auth/TokenGuard.php?ref=yokai.hakaisecurity.io#L70-L120).

Na versão não corrigida, o método `user()` aceita qualquer credencial que não esteja "vazia" antes de consultar o provedor de usuários:

```php
$token = $this->getTokenForRequest();

if (!empty($token)) {
    $user = $this->provider->retrieveByCredentials([
        $this->storageKey => $this->hash ? hash('sha256', $token) : $token,
    ]);
```

No PHP, a função `empty()` retorna `false` para arrays que não estejam vazios, o que faz com que uma credencial que não seja do tipo texto (como um array) passe direto pela checagem inicial. Em seguida, o provedor (`EloquentUserProvider::retrieveByCredentials()`) converte os valores desse array em uma cláusula `whereIn()`:

```php
foreach ($credentials as $key => $value) {
    if (is_array($value) || $value instanceof Arrayable) {
        $query->whereIn($key, $value);
    }
```

A instrução SQL resultante se torna `select * from users where api_token in (?) limit 1`. Como o *payload* vem do corpo de uma requisição JSON (onde o `json_decode` gera um inteiro nativo do PHP), o PDO faz o vínculo do parâmetro como `PARAM_INT`.

Com isso, o MySQL e o MariaDB comparam a coluna do token (que é do tipo `VARCHAR`) numericamente qualquer valor que não comece com um dígito é convertido para `0` um comportamento confirmado durante os testes, nos quais a consulta `SELECT 'poc-token-abc' = 0` retornou `1`. A linha do banco é correspondida e o sistema reconhece a requisição como autenticada.

## **Endpoints Afetados**

Qualquer rota protegida pela proteção baseada em token do Laravel (com o *middleware* `auth:api` ou com uma proteção configurada com o *driver* `token`), que utilize o parâmetro de credencial `api_token`:

Caso de uso comum:

![](https://yokai.hakaisecurity.io/content/images/2026/10/image-19.png)

Exemplo de exploração:

![](https://yokai.hakaisecurity.io/content/images/2026/10/image-20.png)

O primeiro usuário cujo token armazenado não comece com um dígito é retornado pela consulta e definido pela proteção como o usuário autenticado.

**Prova de Conceito**

Com base na vulnerabilidade relatada por KIKOmanasijev, a equipe de pesquisa da Hakai desenvolveu um *exploit* em Python e um laboratório em Docker totalmente reproduzível:[https://github.com/hakaioffsec/GHSA-f9x3-7vq9-cph6-PoC](https://github.com/hakaioffsec/GHSA-f9x3-7vq9-cph6-PoC?ref=yokai.hakaisecurity.io)

O ambiente de testes executa lado a lado, sobre o mesmo banco de dados MySQL 8, o *commit* exatamente vulnerável (`13.x#0189a60b`) e o *commit* com a correção (`13.x#9b21ce0a`):

0:00 

/0:18 

1× 

## **Correção**

A equipe do Laravel corrigiu a vulnerabilidade adicionando a validação `is_string()`, garantindo que credenciais que não sejam do tipo texto jamais cheguem ao provedor de usuários (disponibilizada no *commit* [9b21ce0a9bb ](https://github.com/laravel/framework/commit/8dbb08bccac1be095dba4a9d259a419620f1e8a5?ref=yokai.hakaisecurity.io)para a versão 13.x, e retroportada como [8dbb08bc ](https://github.com/laravel/framework/commit/8dbb08bccac1be095dba4a9d259a419620f1e8a5?ref=yokai.hakaisecurity.io)para a 12.x e [5056ca53 ](https://github.com/laravel/framework/commit/5056ca53797eed9244749695c3bb3f015a38415c?ref=yokai.hakaisecurity.io)para a 11.x).

```diff
-        if (! empty($token)) {
+        if (is_string($token) && ! empty($token)) {

-        if (empty($credentials[$this->inputKey])) {
+        if (! is_string($credentials[$this->inputKey] ?? null) || empty($credentials[$this->inputKey])) {
```

Validada pelo histórico do Git, a correção foi lançada originalmente nas *tags* v13.27.0 (13.x), v12.68.0 (12.x) e v11.56.1 (11.x). O alerta oficial indica as versões >= 13.29.0 e >= 12.68.0 como corrigidas uma indicação conservadora, já que nenhuma alteração afetou o arquivo `TokenGuard.php` entre as versões v13.27.0 e v13.29.0.

## **Recomendações**

Recomenda-se atualizar o pacote `laravel/framework` para a versão 13.29.0 ou superior (para a 12.x: 12.68.0 ou superior; para a 11.x: 11.56.1 ou superior) ou, no mínimo, para a primeira *tag* que contém a correção (v13.27.0).

## **Conclusão**

A exploração desta vulnerabilidade permite que um atacante não autenticado se aproveite da validação flexível do `empty()` no PHP combinada com a conversão implícita para `whereIn()` e a conversão numérica do MySQL/MariaDB para se autenticar como qualquer usuário existente em uma aplicação Laravel, resultando na invasão total da conta (*account takeover*) em rotas protegidas por token. A solução aplicada foi uma validação de *string* diretamente na camada do *guard*.

## Vamos praticar!

O [Hacking Club](https://app.hackingclub.com/?ref=yokai.hakaisecurity.io) é uma plataforma de treinamento focada no desenvolvimento de profissionais de cibersegurança. O desafio [TokenGuard ](https://app.hackingclub.com/training/challenges/155?ref=yokai.hakaisecurity.io)simula um servidor com a vulnerabilidade mencionada nesta postagem e pode ser utilizado para reforçar o conhecimento apresentado.

## **References**

- Vulnerabilidade descoberta por: [KIKOmanasijev](https://github.com/KIKOmanasijev?ref=yokai.hakaisecurity.io)
- Alerta oficial de segurança no GitHub: [GHSA-f9x3-7vq9-cph6](https://github.com/laravel/framework/security/advisories/GHSA-f9x3-7vq9-cph6?ref=yokai.hakaisecurity.io)
- Código vulnerável ([antes](https://github.com/laravel/framework/blob/0189a60b261bbd94bffe21bba4e43323cf6af051/src/Illuminate/Auth/TokenGuard.php?ref=yokai.hakaisecurity.io#L70-L120))
- Código corrigido ([depois](https://github.com/laravel/framework/blob/9b21ce0a9bb2b2599978bc0b0df4abea952ad31c/src/Illuminate/Auth/TokenGuard.php?ref=yokai.hakaisecurity.io#L70-L120))
- PoC desenvolvida por: [Hakai Security](https://github.com/hakaioffsec/GHSA-f9x3-7vq9-cph6-PoC?ref=yokai.hakaisecurity.io)
- [Desafio ](https://app.hackingclub.com/training/challenges/155?ref=yokai.hakaisecurity.io)