Можно ли взломать менеджер безопасности с помощью sun.misc.unsafe?

После обсуждения другого вопроса поднимается интересный вопрос.

Классы, загруженные с помощью менеджера безопасности, защищены соответствующей безопасностью. Эта безопасность может отключить отражение (например).

Вопрос: можно ли взломать менеджер безопасности с помощью sun.misc.unsafe? Если да, то как?

ИЗМЕНИТЬ

Изменено SecuredClassLoader на диспетчер безопасности, о котором идет речь.


person Jérôme Verstrynge    schedule 23.04.2011    source источник


Ответы (2)


Нет. Класс sun.misc.Unsafe требует проверки доступа, как и любое другое привилегированное действие. Вы можете заблокировать его с помощью специального загрузчика классов или менеджера безопасности. Вот простой пример с пустым менеджером безопасности, который показывает, что он выдаст AccessControlException:

System.setSecurityManager(new SecurityManager());
Unsafe unsafe = Unsafe.getUnsafe();
person WhiteFang34    schedule 23.04.2011
comment
Парень забыл упомянуть, что код выполняется на компьютере конечного пользователя (возможно, хакера). Я считаю, что это меняет всю игру... немного ;) - person Vladimir Dyuzhev; 23.04.2011
comment
Да, согласен, это меняет всю игру. Я просто отвечаю на этот конкретный вопрос и оставляю другую часть на другой вопрос :) - person WhiteFang34; 23.04.2011
comment
@road to yamburg Итак, мы установили, что ситуация неодинакова, когда вы запускаете код на контролируемом сервере и в настольном приложении. - person Jérôme Verstrynge; 23.04.2011

Что такое «безопасный загрузчик классов»? SecureClassLoader? Это небезопасно, несмотря на его название. Все, что он делает, это ограничивает источник загрузки класса определенным местом кода.

Поэтому вам даже не нужны какие-либо небезопасные операции, чтобы «сломать» это. Просто, например, убедитесь, что заменяющий взломанный класс находится в пути к классам, прежде чем SecureClassLoader даже получит контроль.

Кто-то в этой ветке уже сказал вам, что у вас не может быть защищенного места в незащищенной среде. Если ваш код развернут на пользовательской машине, пользователь там — Бог, и никакая безопасность JVM не поможет вам просто потому, что JVM — это крошечный слой поверх гораздо более мощных нативных вещей.

person Vladimir Dyuzhev    schedule 23.04.2011
comment
Даже если на машине есть средства доверенных вычислений, такие как защита памяти и т. д.? ;-) (О, подождите. Ни одна известная мне реализация JVM не использует какие-либо функции TC.) - person Chris Jester-Young; 23.04.2011
comment
И взвод десантников за плечами пользователя? Нет, в Java тоже пока нет этой возможности! :D - person Vladimir Dyuzhev; 23.04.2011
comment
Я отредактировал вопрос. Вы поднимаете отличный вопрос о взломанном классе в пути к классу + развертывание на пользовательской машине. - person Jérôme Verstrynge; 23.04.2011