Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #72, НОЯБРЬ 2006 г.

внутри сети

ДРОЗДОВ АНДРЕЙ AKA SULVERUS

Спецвыпуск: Хакер, номер #072, стр. 072-044-3


- VERIFIABLE CODE - КОД, БЕЗОПАСНОСТЬ КОТОРОГО В ДАННЫЙ МОМЕНТ ПРОВЕРЯЕТСЯ СИСТЕМОЙ.

- ILLEGAL CODE - КОД, КОТОРЫЙ ПО КАКИМ-ТО ПРИЧИНАМ НЕ БЫЛ ПРОПУЩЕН В ТРАНСЛЯТОР.

- LEGAL CODE - КОД, ДОПУЩЕННЫЙ В СИСТЕМУ, НО, ВОЗМОЖНО, СОДЕРЖАЩИЙ КАКИЕ-ЛИБО ОШИБКИ ИЛИ ДАЖЕ ИНОРОДНЫЕ КУСКИ КОДА (НАПРИМЕР, ПРИ ЭКСПЛОЙТИНГЕ).

- SAFE CODE - 100% БЕЗОПАСНЫЙ КОД С ТОЧКИ ЗРЕНИЯ СИСТЕМЫ, НЕ ИМЕЮЩИЙ ОШИБОК И УЯЗВИМОСТЕЙ (ТЫ, КОНЕЧНО, ПОМНИШЬ, ЧТО 100% БЕЗОПАСНОСТИ НЕ БЫВАЕТ :)).

Когда верификатор сделает для себя выводы о входящем коде, компилятор отбрасывает «плохие» куски кода (это задается в настройках безопасности системы выполнения).

[в топке.]

Самое главное в системе выполнения кода - это модель его выполнения, которая так и называется VES(Virtual Execution System). VES, подобно модели идеального газа в физике, существует только на словах, а система старается на нее равняться. Цель VES - следить за всей системой и изменениями в ней в определенный момент времени. В идеальной модели все потоки работают параллельно. Для определения состояния виртуальной машины необходимо составить список состояний метода или методов (если их много), то есть все строится иерархически: среда выполнения-> поток-> метод-> таблица состояний в динамической памяти (см. рис 2). В этот момент сборщик памяти «укладывает» всю информацию о состояниях потоков и динамической памяти в общее адресное пространство.

Состояния метода тоже можно разложить на некоторые составляющие - отслеживание изменяемых и не изменяемых данных. В изменяемые входят: указатели, стек, локальные переменные, параметры. В неизменяемые: состояние возврата, описатель метода и описатель безопасности. Для наглядности посмотрим на рисунок 3.

Из состояний метода нас интересует стек вычислений, поскольку он, как правило, и есть самое атакуемое место. В платформе .NET вместо регистров используется стек вычислений для соответствия модели VES. Стек вычислений состоит из ячеек или, если быть точным, слотов. У каждого метода свой стек вычислений, в каждом из них - ограниченное количество слотов из соображений безопасности и потому, что таким образом компилятору легче сориентироваться в момент сборки кода. Нововведением .NET является то, что все слоты в стеке не адресуются, то есть программа не может получить смещение на какой-то определенный слот и что-либо в него записать. Таким образом, возможность взлома приложения и инжекции кода резко снижается.

Однако, есть интересный недочет - система выполнения кода не проверяет правильность типов, указателей и ссылок на объекты. Поэтому занесем в свою секретную записную книжку еще один объект внимания для хакеров и IT-экспертов. Кстати, верификатор проверяет правильность кода, но это не сильно меняет дело, поскольку код можно вклинить в другой момент. Давайте посмотрим, что в этот момент происходит в памяти.

Назад на стр. 072-044-2  Содержание  Вперед на стр. 072-044-4