Что такое ILLegal Byte code?
Читая Java Security, я наткнулся на следующие предложения, но не смог найти удовлетворительного объяснения в Интернете. Может кто-нибудь, пожалуйста, объясните
- Предотвращает загрузку классов с помощью байт-кода
- Предотвращает загрузку в нелегальные пакеты
3 ответа
Однако мы не можем быть уверены, что сам класс безопасен. В SecurityManager все еще есть защитная сеть, которая предотвращает доступ класса к защищенным ресурсам, таким как сеть и локальный жесткий диск, но этого недостаточно. Класс может содержать недопустимый байт-код, подделывать указатели на защищенную память, переполнять или переполнять программный стек или каким-либо другим образом нарушать целостность JVM. Проверьте тему Проверка файла класса в [1]: http://medialab.di.unipi.it/doc/JNetSec/jns_ch5.htm
Верификатор байт-кода выполняет следующие проверки:
- Ветви должны находиться в пределах массива кода для метода.
- Цели всех команд потока управления являются началом команды. В случае широкой инструкции, широкий код операции считается началом команды, а код операции, дающий операцию, измененную этой широкой командой, не считается началом команды. Ветви в середине инструкции запрещены.
- Никакая инструкция не может получить доступ или изменить локальную переменную с индексом, большим или равным количеству локальных переменных, которые ее метод указывает, что она выделяет.
- Все ссылки на пул констант должны быть на запись соответствующего типа. Например: инструкция ldc может использоваться только для данных типа int или float или для экземпляров класса String; инструкция getfield должна ссылаться на поле.
- Код не заканчивается в середине инструкции.
- Выполнение не может выпасть из конца кода.
- Для каждого обработчика исключений начальная и конечная точка кода, защищенного обработчиком, должна находиться в начале инструкции или, в случае конечной точки, сразу после конца кода. Начальная точка должна быть перед конечной точкой. - Код обработчика исключений должен начинаться с действительной инструкции и может не начинаться с кода операции, изменяемого широкой инструкцией.
Исходный код компилируется в байт-код, который распространяется среди пользователей. Если байт-код был поврежден или не был создан компилятором Java, то он может быть недопустимым, то есть байты не имеют смысла.