UAP
User Account Protection (UAP) - это одно из самых важных дополнений в системе безопастности Windows Vista. Более старое название этой возможности: LUA (Least-privileged User Account).
Задача UAP очень проста: предотвратить исполнение неизвестного кода в контексте администратора без явного согласия пользователя, даже если учетная запись пользователя, работающего в данный момент на компьютере, имеет права администратора.
Достигается это путем запуска процесса explorer.exe, который обслуживает рабочий стол, с ограниченными правами. Все что запускается из этого процесса тоже будет унаследовать ограниченный права.
Полный и разделенный маркеры идентификации пользователя
В Windows Vista в коде есть список системных групп которые имеют какие-либо повышенный привелегии, например: Administrators, Backup Operators. Этот список нельзя расширить или сузить.
Для пользователей, которые состоят в одной или нескольких из этих групп, создается два маркера идентификации пользователя (tokens): полный (full token) и разделенный (split token). Полный маркер содержит все группы в который состоит пользователь, он ничем не отличается от маркера, который создается в предшествующих версиях Windows. Разделенный маркер создается из полного путем установления флага "только для запрета доступа" для всех групп в маркере пользователя, которые находятся в списке групп с повышенными привелегиями.
Таким образом процесс работающий с разделенным маркером не будет иметь доступа к ресурсам, для которых контрольный список доступа (access control list) включает только группы с повышенными привелегиями. В то же время, если ресурс в своем контрольном списке доступа содежрит запись запрещающая доступ, например, администраторам, то разделенный маркер также как и полный не будут иметь доступа к такому ресурсу.
Как запустить программу с повышенными привелегиями
В контекстном меню для всех программ теперь есть новый пункт "Run Elevated". Не знаю как это переведут на русский, но что-то вроде "запустить с повышенными привелегиями".
Какие-то программы в принципе не могут работать с разделенным маркером, например, дефрагментация диска или архивация диска. Поэтому в Windows Vista добавлен новый сервис: Application Information Service (сервис информации о приложениях). В нем накоплены "знания" (зачастую полученные экспериментальным путем) о требования различных приложений. Приложения разбиты в 3 категории:
- приложения, которым требуется полный маркер для полноценного функционирования;
- приложения, которые могут работать и с полным, и с разделенным маркером, при этом будут представлять различный набор функциональности;
- приложения, которым не нужен полный маркер, они могут полноценно фунционировать и с разделенным.
Как происходит запуск программ с повышенными привелегиями
Если процесс уже работает с полным маркером, то тут все просто: все, что запускается из этого процесса, тоже будет работать с полным маркером.
Если процесс, у которого есть только разделенный маркер, пытается запустить программу, требующую повышенных, то происходит следующее. CreateProcess пытается запустить процесс, при этом система запрашивает сервис информации о приложениях может ли данное приложение работать с разделенным маркером. Если нет, то CreateProcess вернет новый код об ошибке, специально добавленный для этого случая.
После этого вы можете вызвать CreateProcess снова при этом уже потребовав выполнения программы с полным маркером. Система получив такой запрос показывает окно пользователю с вопросом "согласны ли вы запустить данное приложение с повышенными привелегиями". Если пользователь отказывается, то CreateProcess возвращает ошибку. Если соглашается, то запускается система запускает процесс с полным маркером пользователя (который у нее имеется поскольку она - система).
Замечу, что окно для подтверждения и запуск процесса с повышенными привелегиями производится системой. Поэтому приложения с разделенным маркером никак не могут повлиять на процесс принятия решения и никогда не получают полный маркер идентификации пользователя.
Еще одна особенность запуска процесса с полным маркером из процесса с разделенным маркером - это то, что многие параметры CreateProcess при этом игнорируются, например: потоки ввода/вывода, приоритет. Это сделано, чтобы избежать какого-либо контроля со стороны процесса работающего с разделенным маркером.
Если вы используете ShellExecute, то вам не придется заботится обо всем этом. В Windows Vista вызов ShellExecute модифицирован и уже содержит всю логику, описанную выше.
Очереди оконных сообщений (Window message queues)
Важным элементом User Account Protection является то, что очереди оконных сообщений для процессов с полным и разделенным маркером изолированы. Процессы с разделенным маркером могут посылать оконные сообщения другим процессам с разделенными маркерами, но не могут посылать сообщения процессам с полным маркером. Процессы с полным маркером могут посылать оконный сообщения и процессам с полным маркером и процессам с разделенным маркером.
Таким образом предостващена возможность контроля со стороны процессов с разделенным маркером над процессами с полным маркером через очереди сообщений. В частности одним из следствий этого является то, что процесс с разделенным маркером не может послать сообщение OK в окно, спрашивающее подтверждения запуска процесса с полным маркером.