
CVE-2025-53652: Анализ параметра Git в Jenkins
Эта уязвимость возникает из-за того, что управляемый пользователем ввод из параметров сборки Jenkins небезопасно внедряется в команду Git checkout.
Пользовательский ввод предоставляется в качестве параметра сборки (например, gitParameters), который может содержать вредоносные команды оболочки.
Этот параметр оборачивается в GitParameterValue (расширяющий StringParameterValue), чей метод buildEnvironment() раскрывает его как переменную окружения в контексте сборки без очистки.
Во время процесса SCM checkout Jenkins загружает переменные окружения сборки через build.getEnvironment().
Имя ветки, используемое для checkout (localBranchName), получается из этих переменных окружения.
Затем имя ветки напрямую передаётся методу CheckoutCommand.branch().
Наконец, CheckoutCommand.execute() вызывает базовую команду Git CLI, которая конкатенирует имя ветки без валидации или экранирования.
Это позволяет осуществить инъекцию команд, дающую атакующему возможность выполнять произвольные команды оболочки на хосте сборки Jenkins.
Метод createValue, обрабатывающий пользовательский ввод (например, из HTTP POST JSON-нагрузки). Именно здесь Jenkins принимает предоставленные пользователем значения параметров через запрос (например, "selected": "master; rm -rf /"). Ввод оборачивается в GitParameterValue, который расширяет StringParameterValue, без очистки или валидации ввода. Это означает, что сырые пользовательские данные принимаются как параметр сборки и сохраняются как экземпляр ParameterValue.

Класс GitParameterValue, расширяющий StringParameterValue, GitParameterValue наследуется от StringParameterValue, но не добавляет никакой очистки. Цепочка конструкторов означает, что пользовательский ввод теперь хранится в объекте, который позже будет использоваться Jenkins для построения переменных окружения. Это распространяет вредоносный ввод в переменные окружения сборки Jenkins.

Класс StringParameterValue и его метод buildEnvironment. Этот метод критичен — он раскрывает параметр как переменные окружения в контексте сборки, выполняя:
env.put(name, value);
env.put(name.toUpperCase(Locale.ENGLISH), value);
Поскольку значение — это неочищенный пользовательский ввод, это позволяет вредоносному вводу попасть в переменные окружения Jenkins, делая его доступным для последующих процессов, таких как Git-команды.

Метод _checkout в плагине GitSCM. Этот метод вызывает build.getEnvironment(listener), который собирает переменные окружения, включая те, что были установлены ранее вредоносным параметром. Он использует эти переменные для получения имени ветки (через localBranchName), которое затем передаётся в CheckoutCommand. Переменная окружения из вредоносного параметра напрямую попадает в процесс checkout.

Создание CheckoutCommand и установка ветки/ссылки с пользовательским вводом. CheckoutCommand.branch(localBranchName) использует неочищенную переменную окружения. Поскольку localBranchName пришёл из управляемых пользователем переменных окружения, он внедряет произвольные команды в checkout. Это создаёт предпосылки для инъекции команд при вызове execute().

Метод CheckoutCommand.execute(), который выполняет команду Git CLI. Это финальный шаг, на котором внедрённая строка ветки передаётся напрямую в системную Git CLI без экранирования или очистки. В результате вредоносная нагрузка выполняется как команды оболочки, что позволяет удалённо выполнять код на хосте Jenkins.

Этот анализ показывает, как плагин Git Parameter для Jenkins в сочетании с плагином Git SCM может привести к критической уязвимости инъекции команд. Из-за небезопасного раскрытия управляемых пользователем значений параметров как переменных окружения и последующей передачи их напрямую в команды Git CLI без надлежащей очистки, атакующие могут выполнять произвольные команды на сервере сборки Jenkins.
Эта цепочка нарушения доверия — от начальной вредоносной JSON-нагрузки до финального выполнения в оболочке — подчёркивает важность строгой валидации ввода и безопасной обработки параметров сборки в системах непрерывной интеграции.
Пользователям и администраторам следует убедиться, что они используют обновлённые версии Jenkins и всех плагинов, а также тщательно проверять любые параметры, влияющие на команды оболочки. Меры защиты, такие как очистка ввода, разрешение только разрешённых веток или изоляция сред сборки, могут снизить риск.
Понимание этого потока даёт специалистам по безопасности и разработчикам необходимые знания для обнаружения, предотвращения и устранения подобных уязвимостей инъекций в Jenkins или аналогичных CI/CD платформах.