Как вручную обновить jre на примере PDF24
- Для чего используется JRE в программном обеспечении?
- Ключевые компоненты JRE
- Проблема вендоров и разработчиков, использующих JRE
- Почему вендоры не спешат с обновлениями?
- Что делать если новой версии ПО нет, а JRE уязвимая
- Ручное устранение уязвимостей в OpenJDK
- Как устранить уязвимости JRE пакета на массе серверов
В современном цифровом мире кибербезопасность стала критически важным аспектом использования любых программных продуктов. Ежегодно обнаруживаются сотни уязвимостей в программном обеспечении, включая основывающиеся на Java приложения. Согласно данным Oracle, только в июльском обновлении 2025 года было выпущено 309 патчей для устранения уязвимостей в различных продуктах компании.
Особую озабоченность у специалистов по безопасности вызывают уязвимости в Java Runtime Environment (JRE) — среде выполнения Java-приложений, которая используется в огромном количестве программных продуктов по всему миру. Несвоевременное обновление JRE создает серьезные риски как для конечных пользователей, так и для организаций, использующих такие приложения в своей работе. В этой статье я приведу вам свой практический опыт по закрытию этих дыр, когда разработчик софта еще не успел своевременно это сделать.
Для чего используется JRE в программном обеспечении?
Java Runtime Environment представляет собой среду выполнения для приложений, написанных на языке Java. Согласно определению AWS, JRE — это программное обеспечение, которое требуется для корректной работы программ Java, выступающее в роли "переводчика и посредника" между Java-программой и операционной системой 8.
К сожалению, использование Java вы можете встретить еще много где, например при консольном подключении к BMC на контроллерах СХД, или ряда серверов, где еще не перешли на HTML.
Ключевые компоненты JRE
Виртуальная машина Java (JVM) — выполняет байт-код Java, обеспечивая кроссплатформенность
Библиотеки классов — предоставляют заранее написанный код для common задач
Вспомогательные утилиты — обеспечивают работу с сетью, безопасностью и другими аспектами
Компонент | Назначение | Примеры |
---|---|---|
JVM | Выполнение байт-кода | HotSpot, OpenJ9 |
Библиотеки | Предоставление готового функционала | java.lang, java.util |
Утилиты | Вспомогательные функции | Java Web Start, Plugin |
Благодаря принципу "write once, run anywhere" (напиши один раз, запускай где угодно), Java и JRE получили широкое распространение в корпоративной среде и в потребительском программном обеспечении. Это особенно актуально для кроссплатформенных приложений, которые должны работать на разных операционных системах без модификации исходного кода.
Проблема вендоров и разработчиков, использующих JRE
Многие разработчики программного обеспечения, включая популярные проекты вроде PDF24, включают JRE в состав своих продуктов для обеспечения их работоспособности. Однако зачастую процесс обновления встроенной JRE запаздывает или вообще игнорируется, что создает серьезные бреши в безопасности.
Почему вендоры не спешат с обновлениями?
Сложности тестирования: Обновление JRE требует тщательного тестирования всего функционала приложения, что может занимать значительное время
Совместимость: Новые версии JRE могут содержать изменения, нарушающие обратную совместимость
Ресурсные ограничения: Многие небольшие компании не имеют достаточных ресурсов для оперативного отслеживания и интеграции всех обновлений
Лицензионные вопросы: Некоторые вендоры используют специфические сборки JRE, обновление которых требует дополнительных лицензионных соглашений
Когда я вам рассказывал про библиотеку libssl-3-x64.dll в VMware Tools, я описывал. что даже гигантский Broadcom не успевает это делать. что гоорить уже про небольшие компании, где ресурсы очень ограничены, но надеюсь, что в этом плане им может в будущем помочь ИИ.
Что делать если новой версии ПО нет, а JRE уязвимая
Рассмотрим практические аспекты обновления JRE на примере PDF24. У меня на терминалах установлена самая последняя версия 11.27.0, которая как только появляется возможность патчится средствами SCCM.
Но, к сожалению, в этой версии есть незакрытые уязвимости, например:
CVE-2025-30754 — уязвимость в компоненте JSSE, позволяющая получить доступ к конфиденциальной информации через неверное управление TLS 1.3 handshakes
CVE-2025-50059 — проблема в сетевом компоненте, приводящая к возможности получения конфиденциальной информации
CVE-2025-30749 и CVE-2025-50106 — уязвимости в 2D-компоненте, приводящие к отказу в обслуживании или выполнению произвольного кода
Все они указывают на файл C:\Program Files\PDF24\jre\bin\java.exe (17.0.15.0)
Если разработчик программы не успевает выпустить обновление закрывающее уязвимости JRE, то вы можете попробовать устранить их вручную, если софт позволит это сделать и продолжит работать со свежими версиями.
Ручное устранение уязвимостей в OpenJDK
У Microsoft есть сайт, где вы можете скачать актуальные, ну или как минимум более свежие версии, чем у большинства софта, который использует java.
https://learn.microsoft.com/en-us/java/openjdk/download
Скачиваем microsoft-jdk-17.0.16-windows-x64.zip. Но тут смотрите исходя из поколения microsoft-jdk, если ваш софт 21-го, то берем его, мне нужно патчить версию OpenJDK 17.0.15.
Распаковываем zip-архив, в нем будет 6-7 папок, но меня будут интересовать 4, как изначально в PDF24.
Перед заменой файлов JRE обязательно сохраните копию старых файлов, на случай отката
Далее идем по пути C:\Program Files\PDF24\jre\ и копируем с заменой туда папки и проверяем работу софта. В моем случае версия java (17.0.16.0) успешно прижилась и все запустилось. Поздравляю вы только, что закрыли уязвимости CVE-2025-30754, CVE-2025-50059, CVE-2025-30749, CVE-2025-50106.
Как устранить уязвимости JRE пакета на массе серверов
У меня большая инфраструктура, поэтому есть Active Directory с доменом и блэкджеком. Поэтому я буду пользоваться этим преимуществом. Я поделюсь с вами скриптом PowerShell, который делает вот что:
- Берет список серверов из текстового файла
- На каждый сервер копирует из сетевой шары свежий дистрибутив JRE в локальную папку C:\Temp, как перевалочный пункт (Политики ИБ)
- Далее вырезает локальную папку C:\Program Files\PDF24\jre\ и кладет ее в папку temp, но с префиксом _old
- После чего из папки C:\Temp копируется новая папка jre
- Выводится в таблице отчет по серверам и версия файла
Запускать скрипт лучше из PowerShell ISE и на конечных станциях/серверах у вас должны быть права.
$servers = Get-Content "C:\Temp\RDS\servers-jre.txt"
$credential = Get-Credentialforeach ($server in $servers) {
try {
Invoke-Command -ComputerName $server -Credential $credential -ScriptBlock {# Переименовываем jre
$jrePath = "C:\Program Files\PDF24\jre"
if (Test-Path $jrePath) {
Rename-Item -Path $jrePath -NewName "jre_old" -Force
}# Перемещаем jre_old в Temp
$jreOldPath = "C:\Program Files\PDF24\jre_old"
if (Test-Path $jreOldPath) {
Move-Item -Path $jreOldPath -Destination "C:\Temp\" -Force
}# Копируем из сетевой папки (используем New-PSDrive для аутентификации)
$netCred = $using:credential
New-PSDrive -Name "NetShare" -PSProvider FileSystem -Root "\\c-10-52\share\" -Credential $netCred -Scope Script
Copy-Item -Path "NetShare:\jre" -Destination "C:\Temp\" -Recurse -Force
Remove-PSDrive -Name "NetShare" -Force# Перемещаем в конечное расположение
$tempJrePath = "C:\Temp\jre"
if (Test-Path $tempJrePath) {
Move-Item -Path $tempJrePath -Destination "C:\Program Files\PDF24\" -Force
}
}
}
catch {
Write-Host "Ошибка на сервере $server : $($_.Exception.Message)" -Red
}
}
Надеюсь, что вы поняли основной принцип и в какие-то моменты сможете без поломки софта устранять уязвимости связанные с OpenJDK и его компонентами и немного обгонять разработчиков. С вами был Иван Сёмин, до будущих встреч.