Обход песочницы Groovy в Jenkins позволяет выполнить код на контроллере и похитить учётные данные

Jenkins

Двадцать уязвимостей в тринадцати плагинах Jenkins получили исправления. Основная часть сосредоточена в плагине Script Security, который отвечает за песочницу Groovy. Песочница перехватывает небезопасные операции в пользовательских скриптах и конвейерах сборки, поэтому без проверки такие операции не выполняются. Восемь ошибок позволяют эту защиту обойти. Результат - исполнение произвольного кода в среде контроллера Jenkins. Оттуда злоумышленник добирается до секретов сборки, сохранённых учётных данных, исходного кода, узлов CI/CD и сред развёртывания. Рискуют организации, которые собирают и поставляют ПО через Jenkins. Права на запуск скриптов есть не только у администраторов, но и у разработчиков, а значит, для атаки не нужен полный контроль над сервером.

Детали уязвимостей

В версиях Script Security до 1422.v06869826dd9b_ проверки оказались неполными. Песочница не следила за методом, который значение наследует от интерфейса. Groovy в таком случае создаёт прокси и передаёт вызов по имени, тогда как плагин проверял другой метод. Операции над пустой ссылкой тоже оставались без перехвата. Приведение коллекции к другому типу проходило по элементам, которые никто не проверял. Аннотации, меняющие код на этапе компиляции, срабатывали до включения песочницы. Отдельная ошибка касалась методов, добавленных в класс во время работы программы. Каждый такой пробел позволял выйти за пределы защитной среды и получить доступ к узлам сборки.

Ещё две ошибки связаны с загрузкой внешних библиотек. Администратор копировал задание либо менял его конфигурацию через программный интерфейс или командную строку, и пути к библиотекам одобрялись автоматически. Это CVE-2026-92127. Вторая ошибка, CVE-2026-92128, возникает из-за состояния гонки. Плагин скачивал удалённый архив с классами Java дважды: проверял первую загрузку, а нужные классы брал из второй. Для эксплуатации нужен уже одобренный файл на сервере атакующего. Часть этих ошибок нашли в рамках программы вознаграждения за найденные уязвимости, которую спонсирует Еврокомиссия.

Учётные данные утекают и через другие расширения. В плагине Pipeline: Multibranch шаг resolveScm обращался к учётным данным системного уровня, которые доступны только глобальной конфигурации. Права на настройку задания хватало, чтобы их прочитать. Плагин GitLab собирал ключ кеша из одного идентификатора, без учёта папки, поэтому токен подставлялся из чужого контекста. Оценки у этих ошибок низкие и средние, зато последствия для конвейера с десятками команд заметны. Один неудачно настроенный конвейер способен открыть токены сразу нескольким подрядчикам.

Две уязвимости связаны с подделкой серверных запросов. Плагин Gradle запрашивал сводку по ссылке из журнала сборки, даже когда в настройках указан адрес сервера Develocity. Кто управляет журналом, тот заставляет Jenkins обратиться к своему адресу и получает ключ доступа Develocity. Плагин Bitbucket Push and Pull Request доверял адресам из тела вебхука (автоматического уведомления от внешней системы) и подключался к ним с сохранёнными учётными данными Bitbucket. Одного вредоносного уведомления достаточно, чтобы передать эти данные на чужой сервер.

Плагин Robot Framework не проверял, лежит ли каталог архива отчётов внутри каталога сборки. Пользователь с правом на настройку задания указывал путь за его пределами и создавал либо перезаписывал любые файлы на контроллере. Произвольная запись в файлы контроллера ведёт к выполнению кода, поэтому разработчики отнесли эту ошибку к высокому уровню риска.

Четыре уязвимости межсайтового скриптинга затрагивают плагины Warnings, Coverage, OWASP Dependency-Check и Gitee. Они не проверяют идентификаторы результатов анализа, значения классификатора из отчётов и имя отправителя из уведомления. Злоумышленник с правом на настройку задания или с доступом к вебхуку внедряет скрипт, который выполнится в браузере каждого, кто откроет заражённую страницу. Политика безопасности содержимого в Jenkins 2.539 и новее, а также в LTS 2.541.1 и новее, часть таких атак блокирует. Организациям всё равно советуют обновить плагины, а не полагаться только на браузерную защиту.

Две ошибки касаются перенаправления. В плагине Bitbucket Server Integration форма авторизации брала адрес возврата из отправленных данных, а не из сохранённого запроса. Тот, кто перехватит отправку формы, уведёт браузер жертвы на свой сайт и получит токен доступа OAuth (протокол авторизации). Плагин Keycloak Authentication до версии 2.4.2 не ограничивал адрес перехода после входа. Из-за этого фишинг сразу после аутентификации становится проще.

Исправления вышли для всех тринадцати плагинов. Script Security закрывает свои ошибки в версии 1422.v06869826dd9b_. Gradle устраняет проблему в 2.20.1253, Robot Framework - в 6.3.0, Keycloak Authentication переходит только на относительные адреса. Сведения об использовании этих уязвимостей в реальных атаках в бюллетене не приводятся.

Большинство путей атаки на Jenkins проходит через плагины, и этот случай исключением не стал. Права на настройку задания или запуск конвейера есть у многих разработчиков и подрядчиков. Обход песочницы превращает эти скромные полномочия в доступ к контроллеру и всем его секретам. Инвентаризация расширений, отказ от неиспользуемых плагинов и своевременная установка обновлений сокращают риск сильнее, чем разовые проверки. Заодно имеет смысл пересмотреть, кому и зачем выдали права на настройку заданий.

Ссылки

Комментарии: 0