Как управление приложениями работает с PowerShell
В этой статье объясняется, как управление приложениями для бизнеса защищает PowerShell и накладывает ограничения. Безопасное поведение PowerShell зависит от используемой версии Windows и PowerShell.
Как PowerShell обнаруживает политику блокировки системы
PowerShell обнаруживает как AppLocker, так и управление приложениями для бизнес-систем. AppLocker устарел. Управление приложениями — это предпочтительная система управления приложениями для Windows.
Обнаружение применения политик управления устаревшими приложениями
PowerShell использует устаревший API управления WldpGetLockdownPolicy
приложениями для обнаружения двух элементов:
- Применение системной политики:
None
,Audit
Enforce
- Отдельная политика файлов:
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
. Блокировка оператора области модуля запрещает доступ к частным функциям и переменным модуля.
Дополнительные материалы
- Дополнительные сведения о режимах языка PowerShell см. в about_Language_Modes.
- Сведения о настройке и использовании элемента управления приложениями см. в статье "Использование элемента управления приложениями для PowerShell".
PowerShell