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 отключен по умолчанию.
- Обновите Jenkins (Weekly релиз) до версии 2.442 или выше.
- Обновите 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.