Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #96, ДЕКАБРЬ 2006 г.

Обзор эксплойтов

Крис Касперски

Хакер, номер #096, стр. 096-060-4


«Некоторые интересуются, не повлияет ли на стабильность системы перевод такой значительной части кода в режим ядра. Но риск снижения стабильности системы минимален... Так что в Windows 2000 ошибки, вроде нарушения доступа в том же коде, только выполняемом в режиме ядра, просто быстрее приводят к краху - исключения в режиме ядра требуют прекращения работы системы. Правда теоретически появляется другая опасность. Поскольку этот код выполняется в режиме ядра, ошибка (например, применение неверного указателя) может повредить защищенные структуры данных режима ядра. До Windows NT 4 это могло привести к нарушению доступа, так как запись в страницы режима ядра из пользовательского режима не разрешается. Но результатом стал бы крах системы. Теперь же при выполнении кода в режиме ядра запись на какую-либо страницу памяти по неверному указателю не обязательно вызовет немедленный крах системы. Но если при этом будут повреждены какие-то структуры данных, он скорее всего произойдет. Тем не менее, возникает риск, что из-за такого указателя будет повреждена не структура данных, а буфер памяти, и это приведет к возврату пользовательской программе или записи на диск неверных данных. В заключение отметим, что повышение производительности в результате перевода диспетчера окон и GDI из пользовательского режима в режим ядра достигнуто без сколько-нибудь значимого снижения стабильности и надежности системы».

Как видно, утверждение о «безопасности» переноса GDI внутрь ядра базируется на предположении, что «в GDI ошибок нет», принимаемом за постулат. Но это не верно. Одна из таких ошибок в GDI как раз и позволила проникнуть в ядро с прикладного уровня.

Операционные системы семейства NT вплоть до Server 2003 (и основанной на его ядре Висте), отображали ядерные структуры подсистемы GDI на объект-секцию (не путать с секциями PE-файла). Все они находятся в глобальной разделяемой памяти (global shared memory section), автоматически создаваемой системой для любого процесса, использующего объекты GDI, к которым принадлежат все GUI-приложения. USER является всего лишь надстройкой над GDI.

Система проецирует секцию на адресное пространство процесса с атрибутами read-only, однако никак не догадывается, что пользователю придет в голову создать ре-проекцию GDI-секции, наделив ее любыми атрибутами, какими только душа пожелает (например, writable и executeable), в результате чего у него появляется возможность напрямую модифицировать данные ядра! И все это - даже без прав администратора! Обладая правами администратора, можно просто загрузить драйвер и не мучиться, правда в 64-битной редакции Висты это уже не так. Там для загрузки драйвера, помимо администраторских полномочий, требуется еще и цифровая подпись.

Назад на стр. 096-060-3  Содержание  Вперед на стр. 096-060-5