Um Guia para o Keycloak e suas vulnerabilidades de segurança

Picture of Júlia Valim

Júlia Valim

O que é Keycloak?

O que é Keycloak

O Keycloak é uma ferramenta Open Source que oferece soluções para a gestão de identidade e controle de acesso. Ele facilita a implementação de autenticação e autorização em sistemas e aplicativos, oferecendo recursos como:

  • Autenticação centralizada: Permite que os usuários se autentiquem em várias aplicações utilizando um único login (Single Sign-On – SSO).
  • Autorização e controle de acesso: Oferece mecanismos para definir permissões de acesso a recursos e serviços, com suporte a roles (funções) e políticas de segurança.
  • Integração com provedores de identidade externos: O Keycloak pode ser integrado com provedores como Google, Facebook, LDAP e outros, permitindo a autenticação de usuários a partir dessas fontes.
  • Suporte a protocolos de segurança: O Keycloak é compatível com protocolos de autenticação como OAuth 2.0, OpenID Connect e SAML, facilitando a integração com diversas plataformas e aplicações.

Conceitos básicos do Keycloak

Realm: O realm é um repositório centralizado de usuários, constituindo a base principal para a configuração e gerenciamento dos dados.

Client: O termo client refere-se às “aplicações” ou “clientes” configurados dentro do realm, os quais interagem com os recursos e permissões associadas.

Role: A role é um conjunto de permissões que podem ser atribuídas de forma específica a um client (quando se requer permissões distintas por aplicação) ou ao realm (quando as permissões devem ser independentes das aplicações).

Group: Um group é uma estrutura organizacional que permite a criação de conjuntos de configurações, as quais podem ser aplicadas de maneira centralizada, evitando a necessidade de repetição para cada usuário individual.

Exemplo: Grupo “Departamento Pessoal”.

User: O conceito de user refere-se ao cadastro de usuários, bem como a definição de suas configurações específicas, ou, alternativamente, à vinculação a um grupo previamente criado, com o intuito de simplificar o gerenciamento das permissões.

Identity Providers: Os Identity Providers referem-se a provedores de identidade externos à organização, permitindo que os usuários realizem seu próprio cadastro por meio de métodos como login via Google, Facebook, LinkedIn, entre outros.

User Federation: A User Federation consiste em uma integração com bases de dados externas, possibilitando a vinculação dessas fontes ao Keycloak.

Por exemplo, caso a organização já possua uma base LDAP contendo os dados de todos os usuários, é possível conectar essa base ao Keycloak, o que permite a importação automática dos usuários, eliminando a necessidade de cadastrá-los de forma individual e manual.

Funcionamento do Keycloak

Ele funciona da seguinte maneira:

  1. Usuário entra na URL da aplicação
  2. A aplicação faz o redirecionamento para a página de login do Keycloak
  3. Usuário insere as credenciais
  4. Keycloak valida o usuário
  5. Caso válido, redireciona para a aplicação, caso inválido é retornado a página de login

Podemos visualizar de maneira mais simples por meio da imagem a seguir:

Funcionamento Keycloak

Figura: Funcionamento Keycloak

Como identificar uma aplicação rodando Keycloak

Existem várias formas de identificar isso, porém as mais simples são:

Em alguns momentos, realizando uma varredura dentro da aplicação, você encontra um painel de login que já demonstra o serviço em funcionamento, como o da imagem a seguir:

Aplicação rodando no Keycloak

Figura: Keycloak

Também é possível ao analisar a URL, pois sempre que conter campos como /realms, /myrealm, /openin-connect, indica que há um serviço rodando, como na URL abaixo:

0.0.0.0:8080/auth/realms/myrealm/protocol/openid-connect/auth?client_id=

Dentro do payload JWT, caso houver campos como resource_access:

Payload JWT

Figura: Payload JWT

E dentro do código-fonte da página, onde devemos buscar por campos que contenham /keycloak:

Código-fonte

Figura: Código-fonte

Enumeração de Realms

Realms podem ser enumerados facilmente, utilizando o Burp Suite Intruder, vamos para a URL que contenha a requisição GET /auth/realms/nome_do_realms

Em que no campo nome_do_realms iremos rodar uma lista com possíveis nomes a fim de realizar a enumeração.

Aba Intruder

Figura: Aba Intruder

Realms enumerados

Figura: Realms enumerados

Enumeração de Client IDs

Quando instalado, o Keycloak vem por padrão com alguns Clients predefinidos, sendo eles:

  • account
  • account-console
  • admin-cli
  • broker
  • realm-management
  • security-admin-console

Para realizar uma enumeração de Client ID, iremos realizar o mesmo processo como foi feito com o Realms, porém dentro de outro endpoint, que seria:

/auth/realms/<nome_do_realm>/protocol/openid-connect/auth?client_id=enum&redirect_uri=<…>&state=<…>&response_mode=<…>&response_type=<…>&**scope=openid**&nonce=<…>&code_challenge=<…>&code_challenge_method=<…>

Em que o parâmetro enum irá ser o que iremos realizar a enumeração.

Exemplos de palavras que podem se encaixar na busca seriam: account, account-console, accounts, admin, admin-cli, broker, brokers, realm-management, realms-management, security-admin-console.

A enumeração não vai ocorrer conforme o código retornado, e sim pelo tamanho diferente retornado. Como podemos ver nas imagens a seguir, apenas 1 resultou no código 200, porém tivemos mais 4 itens com o length diferente do padrão, em que o padrão neste caso seria 2646:

Aba Intruder 2

Figura: Aba Intruder

Enumeração concluída

Figura: Enumeração concluída

Podemos validar a enumeração com os clients registrados:

Clients

Figura: Clients

Bypass CSRF

A página de login contém um token CSRF (Cross-Site Request Forgery) que precisa ser extraído e usado neste ataque, para isso vamos realizar uma requisição de login e enviar para o Intruder, dentro dele vamos selecionar o session_code e a senha como pontos onde irá ocorrer o ataque, o tipo de ataque deve ser selecionado o Pitchfork attack:

Aba Intruder 3

Figura: Aba Intruder

Já na aba de Payloads, vamos marcar o primeiro payload com o tipo “Recursive Grep”  e o segundo como “Simple List”. No segundo payload, vamos inserir a lista de senhas que iremos utilizar:

Segundo payload

Figura: Segundo payload

O primeiro payload vamos configurar da seguinte maneira, vamos em Settings, Grep – Extract e vamos selecionar a parte onde apresenta o session_code:

Campo selecionado

Figura: Campo selecionado

Vamos selecionar também o campo “Extract the following items from responses:” e desmarcar o campo “Make unmodified baseline request”:

Campo Grep – Extract

Figura: Campo Grep – Extract

Campo Attack Results

Figura: Campo Attack Results

Vamos voltar para o campo Payloads e colocar em “Initial payload for first request” um session_code do campo de login:

Campo Payload Configuration

Figura: Campo Payload Configuration

Agora iremos para a aba Resource Pool e vamos criar uma nova e marcar a opção “Maximum concurrent requests” para 1:

Campo Resource Pool

Figura: Campo Resource Pool

Por fim iremos rodar o ataque, quando conseguirmos um usuário válido irá ocorrer um redirect (302) e, dessa maneira, iremos obter sucesso no ataque.

Ataque completo

Figura: Ataque completo

Auto cadastrar

Em alguns casos é possível se auto cadastrar, seja por meio do botão visível de se registrar ou pelo link direto para a página. Ambos os casos representam uma vulnerabilidade grave para a aplicação.

Aplicações com o botão para se registrar se tornam mais inseguras, visto que ocorre a exposição publicamente, como pode ser visualizado a seguir:

Registro

Figura: Registro

Aba registro

Figura: Aba registro

Em outros casos não irá aparecer desta forma exposta, porém através de acesso direto também se torna possível registrar dentro da aplicação. O link a seguir pode ser usado como forma de validação:

/auth/realms/<nome-do-realm>/login-actions/registration?client_id=<mesmo-da-página-de-login>&tab_id=<mesmo-do-formulário-de-login>

Vulnerabilidades conhecidas

Em versões mais antigas do Keycloak existem vulnerabilidades conhecidas (CVE), em sua maioria relacionadas a Cross-Site Scripting (XSS), Server-Side Request Forgery (SSRF), entre outras. Todas são relacionadas a versões específicas e com maneiras próprias de explorar as vulnerabilidades. Algumas CVEs relacionadas ao Keycloak são:

Recomendações

Desabilitar auto cadastrar

Não permitir qualquer usuário que acesse o serviço do Keycloak se cadastre é uma ótima maneira de manter seus ativos seguros, tendo em vista que isto abriria maneiras de um atacante infectar seu ambiente.

Para desabilitar, basta ir até Realms Settings, em seguida Login e deixar como “Off” a opção “User registration”:

Painel administrativo

Figura: Painel administrativo

Habilitar detecção de brute force

Manter esta opção habilitada impede com que atacantes realizem alguns ataques dentro do seu ambiente como: brute force, password spray, denail of service, entre outros.

Esta opção fornece configurações adicionais que devem ser adaptadas conforme a regra de seu negócio.

Para habilitar basta:

Ir até Realms Settings, em seguida Security Defenses e por fim Brute Force Detection, como pode ser visualizado na imagem a seguir:

Detecção de brute force

Figura: Detecção de brute force

Implementação de headers de segurança

Security headers são definições incluídas no cabeçalho HTTP que fortalecem a segurança de aplicações web, ao estabelecer diretrizes de comportamento para os navegadores e restringir ações potencialmente maliciosas.

Através da simples implementação deles, alguns ataques podem ser mitigados como:

  • Clickjacking
  • Cross-Site Scripting (XSS)
  • Man-in-the-middle (MITM)

Vale ressaltar de que nenhum security header isoladamente consegue eliminar completamente todos os vetores de ataque. Embora eles sirvam como barreiras importantes contra determinados tipos de ameaças, precisam ser combinados a boas práticas de desenvolvimento seguro para uma aplicação mais segura.

Para implementação basta ir até Realms Settings, Security Defenses e por fim Headers:

Security Headers

Figura: Security Headers

É importante enfatizar que, para a aplicação, não é interessante a adoção de todos os headers listados nesta aba, pois headers como “X-XSS-Protection” e “X-Frame-Options” estão depreciados atualmente, o que irá aumentar sua exposição a vulnerabilidades. Sendo assim, é de maior importância a implementação dos cabeçalhos “Content-Security-Policy, X-Content-Type-Options e HTTP Strict Transport Security (HSTS)”.

Política de senhas

A política de senhas é de extrema importância quando falamos sobre segurança. Definir uma boa política de senhas dificulta para o atacante o comprometimendo da conta de algum usuário. Para isso, a política deve ser definida conforme as boas práticas que podem ser encontradas em aqui.

Para definir a política de senhas, basta ir em Authentication, Password Policy, e para acrescentar basta clicar no botão “Add policy”.

Aba autenticação

Figura: Aba autenticação

Tokens

É importante manter as sessões bem configuradas para aumentar a robustez de sua segurança. A seguir algumas configurações que devem ser implementadas:

Aba Tokens

Figura: Aba Tokens

Aba Tokens 2

Figura: Aba Tokens 2

  • Default Signature Token: Por padrão é o RS256, porém podemos selecionar opção com maiores níveis de segurança como o RS512
  • Revoke Tokens: Serve para revogar os tokens assim que realizado o logout
  • Refresh Token Max Reuse: Definido como 0 para não haver reuso do token
  • SSO Session Indle: Tempo para invalidar uma sessão invativa
  • SSO Session Max: Tempo máximo para uma sessão ser expirada
  • Access Token Lifespan: É o período pelo qual um access token permanece válido antes de expirar
  • Access Token Lifespan for Implicit Flow: Determina a duração dentro da qual um refresh token pode gerar novos access tokens.

Referências

Pentesting Keycloak Part 1: Identifying Misconfiguration Using Risk Management Tools

Pentesting Keycloak – Part 2: Identifying Misconfiguration Using Risk Management Tools

A Quick Guide to Using Keycloak for Identity and Access Management

Reflected XSS via Keycloak on

CVE-2021-20323 Detail

Keycloak Session Configuration: Best Practices and Principles

Keycloak-Sniper

Créditos

Arthur Martins

veja também

Outros conteúdos sobre Segurança Cibernética