CVE-2024-23897

Jenkins Jenkins Command Line Interface (CLI)

ВЫСОКАЯ ВЕРОЯТНОСТЬ

Дата обнаружения

2024-08-19

Официальное описание

Jenkins Command Line Interface (CLI) contains a path traversal vulnerability that allows attackers limited read access to certain files, which can lead to code execution.

🛡️
Технический анализ и план устранения

Суть уязвимости

Уязвимость CVE-2024-23897 связана с особенностью работы библиотеки args4j, которую использует Jenkins CLI для парсинга аргументов командной строки. По умолчанию эта библиотека интерпретирует символ @, за которым следует путь к файлу, как указание прочитать содержимое этого файла и использовать его в качестве аргумента команды.

Злоумышленник может отправить специально сформированную команду через CLI, которая заставит Jenkins прочитать произвольные файлы из файловой системы сервера (Path Traversal). В зависимости от уровня прав атакующего (анонимный пользователь или авторизованный), это позволяет считывать первые несколько строк или файлы целиком. Чтение конфиденциальных данных (например, secrets.key) может привести к расшифровке учетных данных и удаленному выполнению произвольного кода (RCE).

Как исправить

Основным и рекомендуемым способом устранения уязвимости является обновление Jenkins до безопасной версии, в которой парсинг символа @ в CLI отключен по умолчанию.

  1. Обновите Jenkins (Weekly релиз) до версии 2.442 или выше.
  2. Обновите Jenkins (LTS релиз) до версии 2.426.3 или выше.

Для обновления в Linux (Debian/Ubuntu) используйте команды:

sudo apt-get update

sudo apt-get install jenkins

После обновления проверьте версию в интерфейсе Jenkins или через терминал:

jenkins --version

Временные меры

Если немедленное обновление невозможно, необходимо применить одну из следующих мер для снижения риска:

1. Отключение доступа к CLI Это наиболее эффективная временная мера. Отключите возможность взаимодействия с CLI через настройки безопасности или ограничьте доступ на уровне сетевого экрана/прокси.

2. Отключение протоколов CLI (через скрипт автоматизации) Вы можете отключить доступ к CLI, выполнив следующий Groovy-скрипт в "Script Console" (Manage Jenkins -> Nodes -> Built-in Node -> Script Console):

import jenkins.model.Jenkins
import hudson.cli.CLICommand
def inst = Jenkins.getInstance()
inst.getDescriptor("hudson.cli.CLIAction").getBinding().setVariable("allowed", false)
inst.save()

3. Ограничение доступа на уровне Reverse Proxy Если вы используете Nginx или Apache в качестве Reverse Proxy, заблокируйте все запросы к эндпоинту /cli:

Пример для Nginx:

location /cli {
    deny all;
    return 403;
}

4. Отключение SSH порта CLI Убедитесь, что SSH-порт для CLI отключен (по умолчанию он выключен). Проверьте в разделе: Manage Jenkins -> Security -> SSH Server -> SSHD Port -> Disable.