
Этот репозиторий предоставляет обходное решение, предотвращающее эксплуатацию SECURITY-3430 / CVE-2024-43044
Это Java-агент для использования с контроллерами Jenkins, в которых отсутствует исправление для SECURITY-3430 (т.е. версии до 2.470 включительно и LTS 2.452.3).
Он преобразует определение класса, содержащего уязвимость SECURITY-3430, чтобы предотвратить эксплуатацию. Если по какой-то причине это не удаётся, Jenkins принудительно останавливается.
Это обходное решение полностью блокирует ClassLoaderProxy#fetchJar и поэтому несовместимо с соответствующей функциональностью плагинов, упомянутых в сообщении об уязвимости, в отличие от штатного исправления.
Данное обходное решение было успешно протестировано с несколькими недавними версиями Jenkins за последние несколько лет.
ПРЕДУПРЕЖДЕНИЕ: Из-за того, как работает это обходное решение, мы настоятельно рекомендуем регулярно создавать резервные копии Jenkins и развёртывать обходное решение постепенно.
Защита процесса контроллера Jenkins от эксплуатации:
java -javaagent:/path/to/security3430-workaround.jar -jar jenkins.war
Применить преобразование к указанному файлу класса RemoteClassLoader$ClassLoaderProxy.class и записать результат в другой файл:
java -jar /path/to/security3430-workaround.jar <исходный файл> <целевой файл>
Это может быть использовано для создания минимально модифицированных файлов remoting.jar.
Для изменения поведения этого Java-агента можно установить два системных свойства Java:
io.jenkins.security.Security3430Workaround.DISABLE:
Установите true, чтобы отключить преобразование класса.io.jenkins.security.Security3430Workaround.SKIP_SHUTDOWN:
Установите true, чтобы не останавливать процесс Jenkins при сбое преобразования класса.
Рекомендуется только в определённых узких ситуациях, например, при тщательном мониторинге сообщений журнала (см. ниже).Оба должны быть установлены до загрузки класса и попытки преобразования, желательно в качестве опции командной строки -D.
Сообщения журнала используют логгер io.jenkins.security.Security3430Workaround.
Сообщения, зарегистрированные на уровне SEVERE, указывают на сбой преобразования.
Выполните следующий код в консоли скриптов подключённого агента Jenkins, чтобы подтвердить эффективность этого обходного решения:
def cl = Thread.currentThread().getContextClassLoader().proxy
cl.fetchJar(new URL('file:/path/to/jenkins/home/secrets/master.key'))
Без исправления или обходного решения это выведет сообщение, подобное следующему, указывающее на успешную эксплуатацию: Result: [B@23edd8a0
С применённым обходным решением это вызовет AbstractMethodError и выведет длинный стек вызовов.
Лицензировано на условиях лицензии MIT. Copyright 2024 CloudBees, Inc.