Кросс-процесс PostMessage, ограничения UIPI и UIAccess = «true»

Из соображений безопасности модуль пользовательского интерфейса для моего приложения работает с high обязательный уровень целостности. Все в нем прекрасно работает, кроме одного. Для совместимости со старыми версиями мне нужно иметь возможность разрешать пользователям выполнять вызовы командной строки для модуля пользовательского интерфейса.

На данный момент этот механизм работает как таковой:

  1. Ярлык из Windows Explorer вызывает мой модуль, скажем так:

    path-to-module\module.exe -op="a, s, r"
  2. когда module.exe Процесс анализирует эту командную строку, затем находит текущую копию модуля пользовательского интерфейса (или другую копию себя), используя FindWindow его уникальным именем класса. Затем отправляет зарегистрированное сообщение с помощью PostMessage API.

  3. Затем работает модуль пользовательского интерфейса (с high уровень целостности), когда оно получает сообщение, обрабатывает его соответственно.

Проблема в том, что из-за запущенной копии модуля UI high уровень целостности, он не может получать сообщения с более низким уровнем целостности или копию модуля, когда он запускается проводником Windows для анализа команды ярлыка, которая заставляет его работать с medium уровень целостности.

Для решения этой проблемы я нашел это UIAccess флаг (посмотреть здесь, и прокрутите вниз туда, где написаноUIAccess для приложений автоматизации пользовательского интерфейса».)

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

введите описание изображения здесь

он сможет обойти ограничение UIPI, которое я описал выше.

Работает просто отлично:

введите описание изображения здесь

Но я вижу, что PostMessage API в алгоритме, который я описал выше, все еще не работает с ERROR_ACCESS_DENIED, когда я вызываю его из модуля, работающего с medium уровень целостности.

Что я там пропустил?

2

Решение

То, что вы описываете, описано в документации по Win32 API:

Функция PostMessage

Если функция не работает, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError. GetLastError возвращает ERROR_NOT_ENOUGH_QUOTA когда предел достигнут.

Когда сообщение блокируется UIPI, последняя ошибка, полученная с помощью GetLastError, устанавливается на 5 (доступ запрещен).

Где находится UIPI Изоляция привилегий пользовательского интерфейса:

Что такое изоляция привилегий пользовательского интерфейса (UIPI)

Это также известно как изоляция уровня привилегий пользовательского интерфейса (UIPI).

В рамках безопасной инициации в Vista приложения с пользовательским интерфейсом будут работать с тремя различными уровнями привилегий. Окна приложений могут взаимодействовать с другими окнами того же или более низкого уровня, но не могут взаимодействовать с приложениями более высокого уровня / разрешения.

Режимы с более низкими привилегиями могут отправлять сообщения в приложения с более высокими привилегиями, только если это явно разрешено приложением с более высокими привилегиями с вызовом сообщения ChangeWindowMessageFilter(), Также приложения с более низким уровнем привилегий могут только читать HWND принадлежит более привилегированному приложению.

Internet Explorer — это пример процесса, который выполняется с самым низким уровнем привилегий.

Ссылки Ссылки:
http://msdn2.microsoft.com/en-us/library/ms632675.aspx
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnlong/html/AccProtVista.asp

UIPI предотвращает доступ процессов с более низкими привилегиями к процессам с более высокими привилегиями, блокируя следующее поведение.

Процесс с более низким уровнем привилегий не может:

— Выполните проверку дескриптора окна более высокой привилегии процесса.
SendMessage или же PostMessage в окнах приложений с более высокими привилегиями. Эти интерфейсы прикладного программирования (API) возвращают успех, но молча отбрасывают сообщение окна.
— Используйте цепочки потоков, чтобы присоединиться к процессу с более высокими привилегиями.
— Используйте журнальные ловушки для мониторинга процесса с более высокими привилегиями.
— Выполнить динамическую библиотеку ссылок (DLL) — внедрение в процесс с более высокими привилегиями.

При включенном UIPI следующие общие ресурсы USER по-прежнему распределяются между процессами с различными уровнями привилегий.

— Окно рабочего стола, которому на самом деле принадлежит поверхность экрана
— Общая куча рабочего стола только для чтения
— Глобальная таблица атомов
— буфер обмена

Как сказано в документации, приложение с более высокими привилегиями должно использовать ChangeWindowMessageFilter() чтобы разрешить определенные оконные сообщения от приложений с более низкими привилегиями:

Добавляет или удаляет сообщение из фильтра сообщений UIPI.

В Windows 7 и более поздних версиях используйте ChangeWindowMessageFilterEx() вместо:

Изменяет фильтр сообщений пользовательского интерфейса UIPI для указанного окна.

Итак, в вашем случае, после того, как ваш более привилегированный процесс вызывает RegisterWindowMessage() чтобы получить зарегистрированный идентификатор сообщения, необходимо передать этот идентификатор ChangeWindowMessageFilter/Ex() для того, чтобы получить это сообщение от процессов с более низким уровнем привилегий.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]