Блокировать экземпляры класса на уровне JVM?

Есть ли способ настроить JVM для блокировки экземпляров создаваемого класса?

Я хотел бы сделать это, чтобы гарантировать, что ни одной службе, запущенной в JVM, не разрешено создавать экземпляры класса, который был идентифицирован как угроза безопасности в CVE, позволяет вызвать этот класс BadClass.

ПРИМЕЧАНИЕ. Я ищу общее решение, поэтому следующая информация является чисто дополнительной. Обычно я бы решил эту проблему, отключив библиотеку или обновив ее до версии, в которой нет эксплойта, но это часть более крупной библиотеки, которая некоторое время не решает проблему. Так что я даже не использую BadClass где угодно, но хотите полностью заблокировать это.

3 ответа

Решение

Я не знаю параметра JVM, но вот несколько альтернатив, которые могут надуть вас в позиции, которая соответствует вашим требованиям:

  1. Вы можете написать CustomClassLoader, который даст вам полный контроль над тем, что делать. Обычные варианты использования - это загрузка плагинов и т. Д. В вашем случае это больше контроля безопасности на уровне DevOps.

  2. Если у вас есть конвейер CICD с интеграционными тестами, вы также можете запустить JVM с помощью -verbose:classпараметр и посмотрите, какие классы загружаются при запуске ваших тестов. Кажется немного взломанным, но, возможно, подходит для вашего случая использования. Просто добавьте все в игру, и вы сами решаете, какая из них лучше всего подходит.

  3. В зависимости от вашей системы сборки (Maven?) Вы можете ограничить сборку приложений только своими частными кэшированными библиотеками. Таким образом, у вас должен быть полный контроль над ним и между ними должен быть слой библиотеки и обзора. Это также разделит ответственность между разработчиками и администраторами репозитория.

Отчетливый не ответ: даже не пытайтесь!

Что, если большая библиотека, имеющая эту зависимость, захочет вызвать этот метод? Что тогда должно произойти?

Другими словами, что должна делать ваша блокировка?

  • Брось немного Error например, что приводит к срыву JVM?
  • Вернуть ноль, чтобы (может быть, намного позже) другой код работал с NPE?

Помните: этот класс не существует в пустоте. Есть другой код, вызывающий его. Этот код не подготовлен для вашего прихода, и что делать снова?!

Думаю, на эти вопросы нет хороших ответов.

Итак, если вы действительно хотите "манипулировать" вещами:

Попробуйте вместо этого вставить другую версию этого конкретного класса в свой путь к классам. Либо официальный, у которого нет проблем с безопасностью, либо что-то, что соответствует требуемому интерфейсу и делает что-то менее опасное. Или, если вы осмелитесь пойти по этому пути, сделайте то, что предлагает другой ответ, и займитесь делом "мой собственный загрузчик классов".

В любом случае, ваша первая цель: разобраться в своих требованиях здесь. Что значит блокировка?!

Рассматривали ли вы возможность использования Java Agent?

Он может перехватывать загрузку класса в любом загрузчике классов и манипулировать его содержимым до фактической загрузки класса. Затем вы можете либо изменить класс, чтобы удалить/исправить его ошибки, либо вернуть фиктивный класс, который вызовет ошибку в статическом инициализаторе.

Другие вопросы по тегам