Режим ограниченного языка PowerShell не работает в скриптах.

Вопрос или проблема

У меня есть политика AppLocker, которая позволяет выполнять только скрипты, подписанные сертификатом моей компании. Это единственная политика для скриптов, никакая стандартная политика не создана.

Когда я запускаю консоль Windows PowerShell 5.1 или PowerShell 7 (пробовал все это в консоли и терминале) на машине с Windows 11, $ExecutionContext.SessionState.LanguageMode возвращает правильно ConstrainedLanguage (PowerShell 7 отображает эту информацию непосредственно при запуске)

У меня есть очень простой неподписанный скрипт:

$ExecutionContext.SessionState.LanguageMode
[System.Console]::WriteLine("Hello")

Когда я ввожу во второй строке консоли [System.Console]::WriteLine("Hello"), я получаю ожидаемую ошибку:

Невозможно вызвать метод. Вызов метода поддерживается только на основных типах в этом режиме языка.
На строке:1 символ:1
+ [System.Console]::WriteLine("Hello")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodInvocationNotSupportedInConstrainedLanguage

Но когда я запускаю скрипт, вот вывод:

FullLanguage
Hello

Если я протестирую правило AppLocker с помощью

Get-AppLockerPolicy -Effective | 
    Test-AppLockerPolicy -Path C:\Tests\test.ps1 -User Install #("Install" - это мой тестовый пользователь)

Это возвращает правильно:

FilePath           PolicyDecision MatchingRule
--------           -------------- ------------
C:\Tests\test.ps1 DeniedByDefault

Если я добавлю новое правило AppLocker, которое запрещает всем доступ ко всем путям, это правильно возвращается:

FilePath          PolicyDecision MatchingRule
--------          -------------- ------------
C:\Tests\test.ps1         Denied *

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

Если я вызываю скрипт внутри другого (или даже самого себя), несмотря на то, что первый скрипт все еще выполняется в режиме FullLanguage, я получаю ожидаемое поведение для вызова скрипта:

C:\Tests\test.ps1: C:\Tests\test.ps1:3
Line |
   3 |  C:\Tests\test.ps1
     |  ~~~~~~~~~~~~~~~~~
     | Термин 'C:\Tests\test.ps1' не распознается как имя командлета, функции, скриптового файла или исполняемой
     | программы. Проверьте правильность написания имени, или, если был указан путь, убедитесь, что путь правильный, и попробуйте
     | снова.

Если я применю политику Device Guard UMCI, сохранив свою политику AppLocker, скрипт корректно выполняется в режиме ConstrainedLanguage. Это противоречит заявлению Microsoft (заблокированные скрипты вызывают ошибку 8007 в журнале событий, но выполняются в ограниченном режиме). Скриптовые файлы не являются участниками политики Device Guard UMCI, только подписывающий сертификат, и подписанные скрипты также выполняются в ContrainedLanguage… но они должны выполняться в FullLanguage

Какая-либо идея, почему этот скрипт выполняется в режиме FullLanguage несмотря на то, что он не подписан, и почему с политикой UMCI подписанный скрипт выполняется в режиме ContrainedLanguage, несмотря на то, что подписывающий сертификат является частью обеих политик (UMCI и AppLocker)?

Спасибо

Ответ или решение

Вопрос о том, почему режим ограниченного языка PowerShell (Constrained Language Mode) не работает в скриптах, требует глубокого анализа настройки политик безопасности в Windows и поведения PowerShell. Рассмотрим все аспекты, связанные с вашей проблемой.

1. Контекст выполнения скрипта в PowerShell

Вы правильно указали, что режим языка PowerShell может изменяться в зависимости от контекста. Когда вы работаете в интерактивной сессии PowerShell, режим языка определяется настройками безопасности на уровне системы. В этом случае, если вы проверяете $ExecutionContext.SessionState.LanguageMode и получаете значение ConstrainedLanguage, это означает, что ваша текущая сессия действительно находится в ограниченном режиме.

Однако, при запуске скрипта PowerShell могут влиять дополнительные настройки, такие как правила AppLocker и политики UMCI (User Mode Code Integrity). Ваша проблема, когда скрипт выполняется в режиме FullLanguage, несмотря на ожидания, может быть связана с тем, как AppLocker применяет свои правила.

2. Политики AppLocker и UMCI

Вы указали, что у вас есть политика AppLocker, которая разрешает только подписанные скрипты. Однако вы также заметили, что когда вы запускаете не подписанный скрипт, он выполняется в режиме FullLanguage. Это может происходить, если AppLocker по какой-то причине не применяет свои ограничения должным образом.

Политики AppLocker контролируют выполнение приложений, включая PowerShell-скрипты, однако их реализация может зависеть от различных факторов, включая порядок применения правил. Убедитесь, что никаких конфликтующих правил не существует и что ваше правило действительно применимо к окружению, в котором вы работаете.

Политики UMCI также играют значительную роль. Если они настроены на блокировку определенного кода, это может привести к конфликтам с тем, что и как запускается из PowerShell. Когда вы вводите команду Get-AppLockerPolicy -Effective | Test-AppLockerPolicy, это позволяет вам проверить, какие политики применяются и как они работают. Ожидание получения статуса DeniedByDefault подразумевает, что ваши настройки AppLocker функционируют правильно.

3. Почему скрипт запускается в режиме FullLanguage?

Причины, по которым ваш скрипт выполняется в режиме FullLanguage, могут быть следующими:

  • Кэширование или ошибка в политике AppLocker: Возможно, изменения в политике не были должным образом применены. Попробуйте перезагрузить систему, чтобы сбросить кэш и применить последние изменения.
  • Проблемы с контекстом запуска: Убедитесь, что скрипт действительно запускается в контексте пользователя, который подчиняется всем правилам. Например, если вы работаете в режиме администратора, некоторые политики могут не применяться ожиданием.
  • Конфликты с UMCI правилами: Поскольку вы упомянули, что применяете политику UMCI, это может создать дополнительные слои контроля, которые в конечном итоге влияют на запуск кода.

4. Заключение

Подводя итог, можно сказать, что необходимо проверить:

  • Политики AppLocker на наличие конфликтов.
  • Правила UMCI и их влияние на запуск скриптов.
  • Возможные ошибки и кэш в привилегиях запуска.

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

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

Капча загружается...