Блокировать экземпляры класса на уровне JVM?
Есть ли способ настроить JVM для блокировки экземпляров создаваемого класса?
Я хотел бы сделать это, чтобы гарантировать, что ни одной службе, запущенной в JVM, не разрешено создавать экземпляры класса, который был идентифицирован как угроза безопасности в CVE, позволяет вызвать этот класс
BadClass
.
ПРИМЕЧАНИЕ. Я ищу общее решение, поэтому следующая информация является чисто дополнительной. Обычно я бы решил эту проблему, отключив библиотеку или обновив ее до версии, в которой нет эксплойта, но это часть более крупной библиотеки, которая некоторое время не решает проблему. Так что я даже не использую
BadClass
где угодно, но хотите полностью заблокировать это.
3 ответа
Я не знаю параметра JVM, но вот несколько альтернатив, которые могут надуть вас в позиции, которая соответствует вашим требованиям:
Вы можете написать CustomClassLoader, который даст вам полный контроль над тем, что делать. Обычные варианты использования - это загрузка плагинов и т. Д. В вашем случае это больше контроля безопасности на уровне DevOps.
Если у вас есть конвейер CICD с интеграционными тестами, вы также можете запустить JVM с помощью
-verbose:class
параметр и посмотрите, какие классы загружаются при запуске ваших тестов. Кажется немного взломанным, но, возможно, подходит для вашего случая использования. Просто добавьте все в игру, и вы сами решаете, какая из них лучше всего подходит.В зависимости от вашей системы сборки (Maven?) Вы можете ограничить сборку приложений только своими частными кэшированными библиотеками. Таким образом, у вас должен быть полный контроль над ним и между ними должен быть слой библиотеки и обзора. Это также разделит ответственность между разработчиками и администраторами репозитория.
Отчетливый не ответ: даже не пытайтесь!
Что, если большая библиотека, имеющая эту зависимость, захочет вызвать этот метод? Что тогда должно произойти?
Другими словами, что должна делать ваша блокировка?
- Брось немного
Error
например, что приводит к срыву JVM? - Вернуть ноль, чтобы (может быть, намного позже) другой код работал с NPE?
Помните: этот класс не существует в пустоте. Есть другой код, вызывающий его. Этот код не подготовлен для вашего прихода, и что делать снова?!
Думаю, на эти вопросы нет хороших ответов.
Итак, если вы действительно хотите "манипулировать" вещами:
Попробуйте вместо этого вставить другую версию этого конкретного класса в свой путь к классам. Либо официальный, у которого нет проблем с безопасностью, либо что-то, что соответствует требуемому интерфейсу и делает что-то менее опасное. Или, если вы осмелитесь пойти по этому пути, сделайте то, что предлагает другой ответ, и займитесь делом "мой собственный загрузчик классов".
В любом случае, ваша первая цель: разобраться в своих требованиях здесь. Что значит блокировка?!
Рассматривали ли вы возможность использования Java Agent?
Он может перехватывать загрузку класса в любом загрузчике классов и манипулировать его содержимым до фактической загрузки класса. Затем вы можете либо изменить класс, чтобы удалить/исправить его ошибки, либо вернуть фиктивный класс, который вызовет ошибку в статическом инициализаторе.