Как отключить UIPI в Windows

Обновлено 25.11.2019

security logoДобрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В прошлый раз мы с вами разобрали назначение тестового режима в Windows платформах. В сегодняшней заметке мы рассмотрим, что такое и как отключить UIPI (User Interface Privilege Isolation), когда она была внедрена в Windows. Мы рассмотрим, в каких ситуациях, это приемлемо и применимо. Полученные данные помогут вам улучшить свои знания в области безопасности операционных систем семейства Misrosoft.

Что такое UIPI

Изоляция Привилегий Пользовательского Интерфейса или UIPI (User Interface Privilege Isolation) - это технология, которая реализует ограничения в подсистеме Windows, которая не позволяют приложениям с более низкими привилегиями отправлять оконные сообщения или устанавливать перехватчики в процессах с более высокими привилегиями. Приложениям с более высокими привилегиями разрешается отправлять оконные сообщения процессам с более низкими привилегиями. Ограничения реализованы в функциях сообщений SendMessage и связанных окон. Не все оконные сообщения, которые отправляются из процесса с более низким уровнем привилегий в процесс с более высоким уровнем привилегий, блокируются. Как правило, сообщения типа «чтение», например WM_GETTEXT , могут быть отправлены из окна с более низким уровнем привилегий в окно с более высоким уровнем привилегий. Однако сообщения типа записи, такие как WM_SETTEXT, блокируются.

UIPI – User Interface Privilege Isolation

Данная технология появилась в Windows NT 6.0 (Windows Vista, Windows Server 2008 и т. Д.), Которая объединяет множество изменений, включая уровни целостности процессов. UIPI является частью набора контроля учетных записей, который изолирует программы с высокими привилегиями от программ с низкими привилегиями. Процессы, использующие один и тот же интерактивный рабочий стол, не могут отправлять друг другу сообщения на основании их уровней целостности. Таким образом, UIPI предотвращает разрушительную атаку (Shatter attack - https://ru.wikipedia.org/wiki/Shatter_attack).

UIPI работает для пользователей, которые являются членами локальной группы администраторов и работают как обычный пользователь, что означает, что у них могут быть запущены приложения разных уровней на экране. Вся соль в том, чтобы вредоносный процесс с низким уровнем привилегий, не мог запустить код в процессе с более высокими привилегиями (https://ru.wikipedia.org/wiki/Изоляция_привилегий_пользовательского_интерфейса).

Уровень привилегий пользовательского интерфейса находится на уровне процесса и применяется ко всем окнам, созданным процессом. Подсистема USER инициализируется, когда процесс выполняет первый вызов интерфейса графического устройства Windows (GDI). Во время инициализации процесса подсистема USER вызывает подсистему безопасности для определения уровня целостности, назначенного в основном маркере доступа процесса. После того, как подсистема USER устанавливает уровень привилегий пользовательского интерфейса во время инициализации процесса, он не изменяется. Установка более низкого значения TokenIntegrityLevel для потока не влияет на уровень привилегий пользовательского интерфейса процесса или любых окон, открытых этим процессом или потоком.

UIPI не мешает и не изменяет поведение обмена сообщениями между приложениями с одинаковым уровнем привилегий (или целостности). UIPI предотвращает доступ процессов с более низкими привилегиями к процессам с более высокими привилегиями, блокируя следующее поведение. Процесс с более низким уровнем привилегий не может:

  • Выполнить проверку дескриптора окна процесса, выполняющегося с более высокими правами.
  • Использовать SendMessage или PostMessage для окон приложений, работающих с более высокими правами. Эти API возвращают успех, но молча отбрасывают сообщение окна.
  • Использовать цепочки потоков, чтобы присоединиться к процессу, работающему с более высокими правами.
  • Использовать журнальные ловушки для мониторинга процесса, выполняющегося с более высокими правами.
  • Выполнить внедрение динамически подключаемой библиотеки (DLL) в процесс, выполняющийся с более высокими правами.
  • При включенном UIPI следующие общие ресурсы USER по-прежнему распределяются между процессами с различными уровнями привилегий.
  • Окно рабочего стола, которому на самом деле принадлежит поверхность экрана
  • Общая куча рабочего стола только на чтения
  • буфер обмена
  • Рисование на экране - это еще одно действие, которое не блокируется UIPI. Модель интерфейса пользователя/графического устройства (GDI) не позволяет управлять цветовой гаммой поверхностей. Следовательно, приложение, работающее с меньшими правами, может закрашивать поверхность окна приложения, работающего с более высокими правами.

Как работает UIPI

UIPI реализует следующие принципы:

  • Процесс с более высоким уровнем привилегий может отправлять сообщения процессу с более низким уровнем привилегий, но процесс с более низким уровнем привилегий не может отправлять сообщения процессу с более высоким уровнем привилегий.
  • Процессы с более низкими привилегиями могут отправлять сообщения процессов с высокими привилегиями, если им было явно разрешено использовать функцию ChangeWindowMessageFilter ().
  • Процессы более низкого уровня могут читать только из процессов с более высоким уровнем привилегий.
  • Программа также может обходить элемент управления UIPI, если она указывает в своем манифесте "UIaccess" значение "true", это позволяет приложению обходить элемент управления UIPI только при соблюдении следующих условий:

Программа устанавливается в безопасных местах, таких как %Program Files% или %windir% (Переменные среды Windows) за исключением нескольких подкаталогов, которые исключены из-за того, что обычные пользователи имеют доступ для записи. Подкаталоги %WinDir%, которые являются исключенными подкаталогами, включают (https://docs.microsoft.com/en-us/previous-versions/dotnet/articles/bb625963(v=msdn.10)):

\Debug
\PCHealth
\Registration
\System32\ccm
\System32\com
\System32\FxsTmp
\System32\Spool
\System32\Tasks

Приложение подписано валидной цифровой подписью и доверено локальным компьютером. Подписываемое приложение обязательно. Ограничение расположения можно удалить из групповой политики контроля учетных записей пользователей из параметра "Контроль учетных записей пользователей: только приложение Elevate UIAccess, которое хранится в безопасных расположениях", по умолчанию для него установлено значение "включено". Если этот параметр отключен, он удалит безопасное место установки, и программы, установленные за пределами безопасного места, также могут обойти UIPI.

Отключение изоляции привилегий пользовательского интерфейса

Если у вас разработчики не удосужились при разработке приложения его подписать и соблюсти остальные требования для обхода UIPI, то они на время тестирования и работы софта, могут попросить вас отключить User Interface Privilege Isolation на определенном сервере. Microsoft позволяет вам это сделать и самим выбрать уровни безопасности для своей инфраструктуры Active Directory. Существует два варианта для настройки работы UIPI:

  1. Это средствами локальной политики gpedit.msc, применимо для не доменных компьютерах или доменных, где администраторы не хотят создавать отдельную GPO.
  2. Через групповую политику, в случаях массовых настроек в Active Directory, и защита от ручного изменения, так как политика потом все опять исправит как нужно.

Оба принципа отключения UIPI по сути одинаковы, просто выполняются из разных оснасток. Напоминаю, что локальный редактор политик открывается через команду gpedit.msc в окне "Выполнить"

gpedit.msc

оснастку редактора групповых политик вы обнаружите в меню пуске или так же можете открыть в окне выполнить, введя gpmc.msc.

Открыть gpmc.msc

Создаете на уровне нужного вам организационного подразделения, новый объект GPO и приступаете к его редактированию.

Редактирование GPO в управлении групповой политикой

Нас интересует раздел:

Конфигурация компьютера - Политики - Конфигурация Windows - Параметры безопасности - Локальные политики - Параметры безопасности (Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options)

Тут будет ряд политик, которые нам смогут помочь в настройке User Interface Privilege Isolation. Первой политикой, на которую я хочу вам обратить внимание, это "Контроль учетных записей: поведение запроса на повышение привилегий для обычных пользователей (User Account Control: Behavior of the elevation prompt for standard users)". Данная политика настраивает поведение запроса на повышение прав (привилегий) для обычных пользователей в параметрах политики безопасности. Существуют три значения:

  • Автоматически отклонять запросы на повышение прав (Automatically deny elevation requests) - Эта опция возвращает сообщение об ошибке "Отказано в доступе" обычным пользователям, когда они пытаются выполнить операцию, требующую повышения прав. Большинство организаций, которые используют рабочие станции для обычные пользователи, настраивают эту политику, чтобы уменьшить количество обращений в службу поддержки, убрав у людей возможность запуска приложений имеющих повышенный уровень привилегий.
  • Запрос учетных данных на безопасном рабочем столе - Когда операция требует повышения привилегий, пользователю на защищенном рабочем столе предлагается ввести другое имя пользователя и пароль. Если пользователь вводит действительные учетные данные, операция продолжается с применимой привилегией.
  • Запрос учетных данных - Это стоит по умолчанию. Операция, требующая повышения прав, предлагает пользователю ввести имя пользователя и пароль администратора. Если пользователь вводит действительные учетные данные, операция продолжается с применимой привилегией.

отключение UIPI через GPO-03

Для максимальной безопасности лучше выставлять "Автоматически отклонять запросы на повышение прав", этот параметр требует, чтобы пользователь входил в систему с учетной записью администратора для запуска программ, требующих повышения прав или запускал их от имени другого пользователя в своем сеансе. Но для минимизации действия UIPI оставьте значение "Запрос учетных данных".

Для того, чтобы можно было запускать приложения расположенные не в стандартных, доверенных директориях, вы можете настроить политику "Контроль учетных записей: повышать права только для UIAccess-приложений, установленных в безопасном местоположении (User Account Control: Only elevate UIAccess applications that are installed in secure locations)" - Этот параметр политики обеспечивает соблюдение требования, согласно которому приложения, запрашивающие выполнение с уровнем целостности UIAccess (с помощью пометки UIAccess = true в манифесте приложения), должны находиться в безопасном месте в файловой системе.

Ставим в положение "Отключен", в итоге получаем, что приложение может запускаться с целостностью UIAccess, даже если оно не находится в безопасном месте в файловой системе.

Контроль учетных записей: повышать права только для UIAccess-приложений, установленных в безопасном местоположении

Целостность UIAccess позволяет приложению обходить ограничения UIPI (User Privilege Isolge Isolage Isolage Isolation Isolage Isolation), когда у пользователя повышены привилегии от обычного пользователя до администратора. Если этот параметр включен, приложение, для которого в манифесте установлен флаг UIAccess со значением true, может обмениваться информацией с приложениями, работающими с более высоким уровнем привилегий, такими как приглашения на вход в систему и приглашения на повышение привилегий. Эта возможность требуется для поддержки специальных возможностей, таких как программы чтения с экрана, которые передают пользовательские интерфейсы в альтернативные формы, но это не требуется для большинства приложений.

Еще можете отключить безопасный рабочий стол. В политике "Контроль учетных записей: разрешать UIAccess-приложениям запрашивать повышение прав, не используя безопасный рабочий стол (User Account Control: Switch to the secure desktop when prompting for elevation)" - Этот параметр политики определяет, будет ли запрос на повышение прав запрашиваться на интерактивном рабочем столе пользователя или на защищенном рабочем столе.

отключение UIPI через GPO-05

Безопасный рабочий стол представляет интерфейс входа в систему и ограничивает функциональность и доступ к системе до тех пор, пока не будут выполнены требования входа в систему. Основное отличие защищенного рабочего стола от рабочего стола пользователя состоит в том, что здесь разрешено запускать только доверенные процессы, работающие в качестве SYSTEM (то есть ничего не выполняется на уровне привилегий пользователя). Путь к безопасному рабочему столу с рабочего стола пользователя также должен быть доверенным по всей цепочке.

Для применения политики вам не потребуется перезагрузка, вы можете просто дождаться 90 минут и она обновится сама, или же вы открываете окно командной строки и вводите:

Как заставить разработчиков не отключать User Interface Privilege Isolation

Логично предположить, что изоляция привилегий пользовательского интерфейса весьма полезная вещь и помогает повысить уровень безопасности в операционных системах Windows и глупо было бы ее отключать. Вы можете предложить своим разработчикам при сборке проекта в Visual Studio выставить параметр "UAC bypass UI protection" со значением "True" в "Project Properties - Linker settings - set UAC Execution level to “requireAdministrator”".

UAC bypass UI protection

По мимо этого, если ваше приложение не имеет цифровой подписи и в манифесте указано значение uiAccess = true, произойдет сбой с сообщением "A referral was returned from the server." Если вы хотите создать доверенный "тестовый" сертификат для подписи вашего приложения, чтобы вы могли использовать свое приложение на своем текущем компьютере, то выполните:

В этих инструкциях предполагается, что у вас установлена ​​Visual Studio и используется командная строка, в которой установлены все переменные среды для поиска утилит SDK, таких как makecert и signtool. Если нет, вам нужно найти эти инструменты на жестком диске, прежде чем запускать их.

В командной оболочке выполните следующие команды:
# makecert -r -pe -n "CN=Test Certificate - For Internal Use Only" -ss PrivateCertStore testcert.cer
# certmgr.exe -add testcert.cer -s -r localMachine root

3) Подпишите ваш файл

  • В командной оболочке перейдите к местоположению вашего exe
  • В командной оболочке введите:

SignTool sign /v /s PrivateCertStore /n "Test Certificate - For Internal Use Only" /t http://timestamp.verisign.com/scripts/timestamp.dll YOUR-APP.exe

Замените YOUR-APP.exe на имя вашего приложения. Теперь, получив цифровую подпись, переместите исполняемый файл в c:\Windows\System32. Ваш EXE запросит разрешение, прежде чем он запустится, и вы сможете убедиться в проверке Цифровой подписи.

Как выяснить уровень привилегий процесса

Для этого мы воспользуемся утилитой Process Explorer, входящей в состав пакета sysinternals. Запускаем Process Explorer, вы увидите список процессов, их PID, имя разработчика, описание и потребляемую память.

Запуск Process Explorer

Щелкаем правым кликом по полям и выбираем пункт "Select Columns".

Выбор столбцов в Process Explorer

На вкладке "Process Image" выставите птички на пунктах "integrity Level" и "UI Access"

Выбор столбцов в Process Explorer

В итоге мы видим на против каждого процесса его уровень надежности.

Тип привилегий UIPI в Process Explorer

Надеюсь, что данная заметка окажется полезной и найдет своего читателя. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *