JetBrains исправила в TeamCity три уязвимости. Каждую вендор относит к высокому уровню угрозы. TeamCity - сервер непрерывной интеграции и доставки (CI/CD), то есть программа, которая собирает код из репозитория, прогоняет тесты и выкладывает готовые сборки на рабочие серверы. Обновления получили ветки 2026.2, 2026.1.4 и 2025.11.8. Первую брешь нашёл исследователь под ником b00ts, ещё две - под ником hritikxx8.
Детали уязвимостей
Первый сюжет связан с песочницей - изолированной средой, где чужой код исполняется отдельно от основного сервера. Речь идёт о версионируемых настройках (versioned settings), то есть о конфигурации проекта, которую сервер хранит не у себя, а в репозитории. Описывают такую конфигурацию на языке Kotlin DSL. Код на нём должен крутиться в песочнице и не дотягиваться до самого TeamCity. Проверка опасных конструкций оказалась неполной - это класс ошибок CWE-184, неполный список запрещённых операций. Часть конструкций фильтр пропустил, и они исполнились за пределами изоляции, уже на сервере сборки. Проблему закрыли под номером TW-101840.
Песочница здесь нужна не для красоты. Настройки из репозитория пишут разные команды, и без изоляции любой, кто имеет право на коммит в хранилище конфигурации, получал бы прямой доступ к серверу сборки. Побег из песочницы ломает именно эту границу и превращает право менять настройки в право исполнять код.
Второй случай выглядит проще технически, но бьёт по Windows-инфраструктуре. Речь о настройках подключения Git в конвейере (pipeline - цепочка шагов сборки). Пользователь, уже прошедший аутентификацию и имеющий право править эти настройки, мог вписать в поле пару управляющих символов - CRLF, то есть возврат каретки и перевод строки, стандартный разделитель строк в Windows. Значение поля разрывалось, и вторая его половина воспринималась как отдельная команда. Так на агентах сборки под Windows исполнялся произвольный код. Формально это внедрение команд операционной системы, класс CWE-78. Заплатка - TW-102697.
Уязвимость в процедуре сброса пароля выглядит скромнее двух первых, но последствия у неё самые тяжёлые. Проверка входных данных там была неполной, и злоумышленник получал возможность сбросить пароль чужой учётной записи. Самая ценная цель - аккаунт администратора: он даёт полный контроль над сервером и всеми его проектами. Ошибку отнесли к классу CWE-1289, некорректная проверка входных данных. Исправление помечено как TW-102648.
Присматриваться к таким обновлениям стоит потому, что сервер CI/CD - узел, через который проходит почти всё: исходный код, токены доступа, ключи подписи, учётные данные для развёртывания, доступ к репозиториям и облачным окружениям. Захватив его, атакующий подменяет артефакты, забирает секреты и двигается дальше по инфраструктуре компании. Такой сценарий описывают как атаку на цепочку поставок (supply chain attack - компрометация одного звена ради заражения всех, кто получает его продукт). Подмена сборки означает, что вредоносный код приедет к заказчикам и пользователям подписанным и доверенным.
Три ошибки разного характера в одном продукте - повод не откладывать обновление. Информации о применении этих уязвимостей в реальных атаках JetBrains не приводит. Публичных эксплойтов под них тоже пока не описано. Риск снижает и то, что CRLF-инъекция требует действующей учётной записи с правом менять настройки конвейера. Но админ-панель TeamCity нередко доступна из внутренней сети, а угнанный аккаунт разработчика или недовольный сотрудник сводят эту защиту на нет. Сброс пароля администратора в этом раскладе - самый быстрый путь к полному контролю.
Действовать стоит по порядку. Обновите TeamCity до 2026.2, 2026.1.4 или 2025.11.8 в зависимости от используемой ветки. Если обновление приходится отложить, ограничьте круг тех, кто может править настройки конвейеров и версионируемые настройки, и проверьте права на подключения Git. Просмотрите журналы сервера на предмет неожиданных сбросов пароля и необычных команд на Windows-агентах. Отдельно проверьте, у кого есть администраторский доступ и не появились ли в списке лишние учётные записи. Многофакторная аутентификация для администраторов тоже не будет лишней, хотя саму ошибку в сбросе пароля она не закрывает.
Обновление гасит сразу несколько разных классов ошибок: неполную фильтрацию опасных конструкций, внедрение команд и слабую проверку данных в процедуре восстановления доступа. Каждая из них по отдельности требует определённых условий, и ни одну нельзя назвать тривиальной. Вместе они показывают, что проверка прав и фильтрация входных данных в инструментах сборки остаются участком, где ошибки обходятся дорого - слишком много доверия сосредоточено в одной точке инфраструктуры.
Ссылки