Поделиться через


Как управление приложениями работает с PowerShell

В этой статье объясняется, как управление приложениями для бизнеса защищает PowerShell и накладывает ограничения. Безопасное поведение PowerShell зависит от используемой версии Windows и PowerShell.

Как PowerShell обнаруживает политику блокировки системы

PowerShell обнаруживает как AppLocker, так и управление приложениями для бизнес-систем. AppLocker устарел. Управление приложениями — это предпочтительная система управления приложениями для Windows.

Обнаружение применения политик управления устаревшими приложениями

PowerShell использует устаревший API управления WldpGetLockdownPolicy приложениями для обнаружения двух элементов:

  • Применение системной политики: None, AuditEnforce
  • Отдельная политика файлов: None( Audit разрешено политикой), Enforce (запрещено политикой)

Все версии PowerShell (версии 5.1 — v7.x) поддерживают обнаружение этой политики управления приложениями.

Последнее обнаружение применения политики управления приложениями

Элемент управления приложениями представил новые API в последних версиях Windows. Начиная с версии 7.3 PowerShell использует новый WldpCanExecuteFile API для определения того, как следует обрабатывать файл. Windows PowerShell 5.1 не поддерживает этот новый API. Новый API имеет приоритет над устаревшим API для отдельных файлов. Однако PowerShell продолжает использовать устаревший API для получения конфигурации системной политики. Если новый API недоступен, PowerShell возвращается к старому поведению API.

Новый API предоставляет следующие сведения для каждого файла:

  • WLDP_CAN_EXECUTE_ALLOWED
  • WLDP_CAN_EXECUTE_BLOCKED
  • WLDP_CAN_EXECUTE_REQUIRE_SANDBOX

Поведение PowerShell в политике блокировки

PowerShell может выполняться как в интерактивных, так и неинтерактивных режимах.

  • В интерактивном режиме PowerShell — это приложение командной строки, которое принимает пользователям входные данные командной строки в качестве команд или сценариев для выполнения. Результаты отображаются пользователю.
  • В неинтерактивном режиме PowerShell загружает модули и запускает файлы скриптов без ввода пользователем. Потоки данных результатов либо игнорируются, либо перенаправляются в файл.

Интерактивный режим, выполняемый при применении политик

PowerShell выполняет команды в ConstrainedLanguage режиме. Этот режим запрещает интерактивным пользователям выполнять определенные команды или выполнять произвольный код. Дополнительные сведения об ограничениях в этом режиме см . в разделе ограничений PowerShell в разделе политики блокировки этой статьи.

Неинтерактивный режим, запущенный при применении политики

Когда PowerShell запускает скрипт или загружает модуль, он использует API управления приложениями для получения применения политики для файла.

PowerShell версии 7.3 или более поздней использует WldpCanExecuteFile API, если он доступен. Этот API возвращает один из следующих результатов:

  • WLDP_CAN_EXECUTE_ALLOWED: файл утвержден политикой и используется в FullLanguage режиме с несколькими ограничениями.
  • WLDP_CAN_EXECUTE_BLOCKED: файл не утвержден политикой. PowerShell выдает ошибку при запуске или загрузке файла.
  • WLDP_CAN_EXECUTE_REQUIRE_SANDBOX: файл не утвержден политикой, но он по-прежнему может быть запущен или загружен в ConstrainedLanguage режиме.

В Windows PowerShell 5.1 или если WldpCanExecuteFile API недоступен, поведение PowerShell для каждого файла —

  • None: файл загружается в FullLanguage режиме с несколькими ограничениями.
  • Audit: файл выполняется или загружается в FullLanguage режиме без ограничений. В PowerShell 7.4 или более поздней версии сведения об ограничениях политики записываются в журналы событий Windows.
  • Enforce: файл выполняется или загружается в ConstrainedLanguage режиме.

Ограничения PowerShell в политике блокировки

Если PowerShell обнаруживает, что система находится под политикой блокировки управления приложениями, она применяет ограничения, даже если скрипт является доверенным и запущен в FullLanguage режиме. Эти ограничения препятствуют известному поведению PowerShell, что может привести к произвольному выполнению кода в заблокированной системе. Политика блокировки применяет следующие ограничения:

  • Определение точки модуля с ограничением экспорта функции подстановочных знаков

    Любой модуль, использующий метод dot-sourcing и экспорт функций с помощью подстановочных знаков, приводит к ошибке. Блокировка экспорта подстановочных знаков предотвращает внедрение скрипта от вредоносного пользователя, который может посадить ненадежный скрипт, который получает dot-sourced в доверенный модуль. Затем вредоносный скрипт может получить доступ к частным функциям доверенного модуля.

    Рекомендация по безопасности. Никогда не используйте dot-sourcing скрипта в модуле и всегда экспортируйте функции модуля с явными именами (без подстановочных знаков).

  • Вложенный модуль с ограничением экспорта функции подстановочного знака

    Если родительский модуль экспортирует функции с помощью подстановочных знаков имени функции, PowerShell удаляет любое имя функции в вложенном модуле из списка экспорта функций. Блокировка экспорта подстановочных знаков из вложенных модулей предотвращает случайное экспорт опасных вложенных функций с помощью сопоставления имен подстановочных знаков.

    Рекомендация по безопасности. Всегда экспортируйте функции модуля с явными именами (без подстановочных знаков).

  • Преобразование типа параметра интерактивной оболочки

    Если система заблокирована, интерактивные сеансы PowerShell выполняются в ConstrainedLanguage режиме, чтобы предотвратить произвольное выполнение кода. Доверенные модули, загруженные в сеанс, выполняются в FullLanguage режиме. Если командлет доверенного модуля использует сложные типы для его параметров, преобразование типов во время привязки параметров может завершиться ошибкой, если преобразование не разрешено через границы доверия. Сбой возникает при попытке PowerShell преобразовать значение путем запуска конструктора типов. Конструкторы типов не могут выполняться в ConstrainedLanguage режиме.

    В этом примере преобразование типа привязки параметров обычно допускается, но завершается сбоем при выполнении в ConstrainedLanguage режиме. Конструктор ConnectionPort типов не допускается:

    PS> Create-ConnectionOnPort -Connection 22
    Create-ConnectionOnPort: Cannot bind parameter 'Connection'. Cannot convert the "22"
    value of type "System.Int32" to type "ConnectionPort".
    
  • Enter-PSHostProcess Командлет запрещен

    Командлет Enter-PSHostProcess отключен и вызывает ошибку при использовании. Эта команда используется для сеансов присоединения и отладки. Он позволяет подключаться к любому другому сеансу PowerShell на локальном компьютере. Командлет отключен, чтобы предотвратить раскрытие информации и произвольное выполнение кода.

Ограничения PowerShell в ограниченном языковом режиме

Скрипт или функция, которая не утверждена политикой управления приложениями, недоверена. При выполнении ненадежной команды PowerShell блокирует выполнение команды (новое поведение) или выполняет команду в ConstrainedLanguage режиме. Следующие ограничения применяются к режиму ConstrainedLanguage :

  • Add-Type Командлет запрещен

    Блокировка Add-Type предотвращает выполнение произвольного кода .NET.

  • Import-LocalizedData Ограниченный командлет

    Блокировка параметра Import-LocalizedData SupportedCommand предотвращает выполнение произвольного кода.

  • Invoke-Expression Ограниченный командлет

    Все блоки скриптов, передаваемые командлету Invoke-Expression , выполняются в ConstrainedLanguage режиме, чтобы предотвратить произвольное выполнение кода.

  • New-Object Ограниченный командлет

    Командлет New-Object ограничен использованием только разрешенных типов .NET и COM, чтобы предотвратить доступ к ненадежным типам.

  • ForEach-Object Ограничение командлета

    Вызов метода type для переменных, передаваемых в него ForeEach-Object , запрещен для любого типа .NET, не в утвержденном списке. Как правило, режим запрещает вызов любого метода объекта, ConstrainedLanguage за исключением утвержденных типов .NET, чтобы предотвратить доступ к ненадежным типам .NET.

  • Export-ModuleMember Ограничение командлета

    Использование Export-ModuleMember командлета для экспорта функций в файл скрипта вложенного модуля, в котором дочерний модуль не является доверенным, и родительский модуль является доверенным, приводит к ошибке. Блокировка этого сценария предотвращает экспорт вредоносных ненадежных модулей из доверенного модуля.

  • New-Module Ограничение командлета

    При выполнении New-Module в доверенном скрипте любой блок скрипта, предоставленный ScriptBlock параметром, помечается для запуска в ConstrainedLanguage режиме, чтобы предотвратить внедрение произвольного кода в контекст доверенного выполнения.

  • Configuration ключевое слово не разрешено

    Ключевое Configuration слово языка не допускается в ConstrainedLanguage режиме предотвращения атак внедрения кода.

  • class ключевое слово не разрешено

    Ключевое class слово языка не допускается в ConstrainedLanguage режиме, чтобы предотвратить внедрение произвольного кода.

  • Ограничения области обработки блоков скриптов

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

  • Предотвращение обнаружения команд ненадежных функций скриптов

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

  • Не разрешено преобразование хэш-файла в объект

    ConstrainedLanguage Режим блокирует хэш-таблицы преобразования объектов в Data разделах файлов данных PowerShell,.psd1 чтобы предотвратить потенциальные атаки на внедрение кода.

  • Ограничение автоматического преобразования типов

    ConstrainedLanguage Режим блокирует автоматическое преобразование типов, за исключением небольшого набора утвержденных безопасных типов, чтобы предотвратить потенциальные атаки на внедрение кода.

  • Ограничение экспорта неявных функций модуля

    Если модуль явно не экспортирует функции, PowerShell неявно экспортирует все определенные функции модуля автоматически в качестве удобной функции. В ConstrainedLanguage режиме неявный экспорт больше не происходит при загрузке модуля через границы доверия. Блокировка неявного экспорта предотвращает непреднамеренное воздействие опасных функций модуля, не предназначенных для общедоступного использования.

  • Файлы скриптов не могут быть импортированы в виде модулей

    PowerShell позволяет импортировать файлы скриптов (.ps1) в виде модуля. Все определенные функции становятся общедоступными. ConstrainedLanguage Режим блокирует импорт файла скрипта, чтобы предотвратить непреднамеренное воздействие опасных функций скрипта.

  • Установка ограничения переменных AllScope

    ConstrainedLanguage режим отключает возможность установки AllScope переменных. Ограничение области переменных предотвращает вмешательство переменных в состояние сеанса доверенных команд.

  • Вызов метода Type не разрешен

    ConstrainedLanguage Режим не разрешает вызов метода для неутвержденных типов. Блокировка методов для неутвержденных типов предотвращает вызов методов типа .NET, которые могут быть опасными или разрешать внедрение кода.

  • Методы задания свойств type не разрешены

    ConstrainedLanguage режим ограничивает вызов методов задания свойств в неутвержденных типах. Блокировка наборов свойств для неутвержденных типов предотвращает атаки на внедрение кода.

  • Не разрешено создание типов

    ConstrainedLanguage Режим блокирует создание типа для неутвержденных типов, чтобы блокировать ненадежные конструкторы, которые могут разрешить внедрение кода.

  • Оператор области модуля не разрешен

    ConstrainedLanguage в режиме не допускается использование оператора области модуля. Например: & (Get-Module MyModule) MyFunction. Блокировка оператора области модуля запрещает доступ к частным функциям и переменным модуля.

Дополнительные материалы