Изоляция нулевой сессии
Нет, ну это уже хвост знает что! Гордится закрытием дыры четырехлетней (!) давности может только отдел маркетинга Microsoft. Остальные бы по крайней мере сдали это втихую, чтобы не позориться…
История началась в августе 2002 с публикации Криса Пэджета (Chris Paget) "Exploiting design flaws in the Win32 API for privilege escalation" (использование дефектов проектирования Win32 API для повышения привилегий), описывающей элегантный трюк: находим окно более привилегированного приложения со строкой редактирования и засылаем туда shell-код путем посылки сообщения WM_SETTEXT, управление на который передается через таймер, работающий в контексте уязвимого приложения и устанавливаемый отправкой еще одного сообщения — WM_TIMER. Атаки подобного типа получили название "shatter attacks" и чрезвычайно взволновали общественность, просочившись даже в некомпьютерную прессу.
Собственно говоря, оконная подсистема Windows является одной большой дырой, простительной для Windows 3.x и 9x, где понятие привилегий отсутствует как класс, и "натянутой" на NT без учета системы разграничения доступа. Ни для кого не секрет, что сообщения позволяют манипулировать элементами управления более привилегированных приложений, в частности, отключать брандмауэры и антивирусы, запускать от их имени другие программы и т. д. Тем не менее, Microsoft категорически отказалась признавать это "дефектом проектирования" и выпустила заплатки для NT, w2k и XP лишь в декабре, под напором возмущенных пользователей.
Изучение заплаток показало, что никакие это не заплатки, а… так, слабая подобие левой руки, в смысле лишь имитация защиты. Возможность отправки сообщения окнам более привилегированных процессов как была, так и осталась. И вот в висте… нет, до решения проблемы дело так и не дошло, но кое-какие подвижки уже сделаны. Правда, не в том направлении, но это ничего… Microsoft предприняла для "революционных" шага, касающиеся системных сервисов (но никак не затрагивающие все остальные приложения).
Если раньше локальный пользователь, первым входящий в систему, регистрировался в нулевой сессии, откуда запускались все службы, то теперь нулевая сессия целиком отдана под службы и ее очередь сообщений изолирована от очереди сообщений всех остальных сессий, в которых регистрируются пользователи. В результате, мы имеем на одну сессию больше, чем раньше. Для серверов это, может быть, и не страшно, а вот на рабочих станциях, 99% своего времени проводящих в "объятиях" одного-единственного пользователя (изредка запускающего утилиту runas) мы получаем неоправданное транжирство системных ресурсов.
Рисунок 5 в w2k и XP службы работают в той же самой сессии, что и приложения первого вошедшего в систему пользователя
Второй шаг является следствием того, что первый шаг получился не так, как хотелось и пришлось в спешном порядке анонсировать изоляцию пользовательских интерфейсов от принадлежащих им процессов — "User Interface Process Isolation" (или, сокращенно, UIPI). Если бы хакеры были действительно лишены возможности по-прежнему посылать сообщения окнам более привилегированных приложений — этого бы в принципе не потребовалось. А так Microsoft "отодрала" интерфейс от привилегированных служб, запустив его в непривилегированном режиме.
Рисунок 6 в висте службы работают в отдельной сессии, изолированной от пользовательских приложений
Надо признать, что и второй шаг у Microsoft не очень хорошо получился. Какая радость — shatter-атаки перестали работать!!! То есть _как_ _бы_ перестали, а на самом деле они очень даже! Да, повысить свои привилегии через засылку shell-кода хакеры уже не смогут, но вот взаимодействовать со службой через предоставленный ею интерфейс им _ничего_ не мешает!!! А большего хакерам обычно и не нужно. Тем более, что речь идет о локальных атаках, актуальность которых в приличном обществе нормальные люди не обсуждают, поскольку, существует тысяча и один способ повышения своих привилегий, если, конечно, их есть куда повышать (про то, что большинство пользователей сидит под администратором мы уже говорили).