Blogs

UAP

  • Comments 5
  • Likes
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 в окно, спрашивающее подтверждения запуска процесса с полным маркером.
 
Comments
  • Читал недавно блог Виталия Прокопенко и мне очень понравися его посл про User Account Protection (UAP)...

  • Присоединяюсь. Прокопенко - молодец.

  • Виталий,
    Спасибо за пост.

    Вы пишете: "Замечу, что окно для подтверждения и запуск процесса с повышенными привелегиями производится системой. Поэтому приложения с разделенным маркером никак не могут повлиять на процесс принятия решения и никогда не получают полный маркер идентификации пользователя."

    А как быть в ситуациях, когда процессу требуется доступ к сетевым ресурсам? Ведь системный аккаунт не имеет доступа к сети. Для этого, собственно, был создан аккаунт Network Service, который однако не имеет привилегий системного аккаунта.

  • вообще-то сервисы, работающие в контексте системы, имеют доступ к сети и используют для этого учетную запись компьютера (machine account). сервисы же, работающие в контексте NetworkService, имеют доступ к сети только как анонимный пользователь. т.е. в каком-то смысле системные сервисы имеют большие привелегии в сети нежели сервисы работающие в контексте NetworkService.

    но в данном случае это не важно, поскольку все, что я описал выше, происходит на локальном компьютере.

  • Этот случай мне с одной стороны показался забывным, а с другой - демонстрирующим насколько серьезно Microsoft

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment