Политика выполнения PowerShell подорвана параметром powershell.exe?

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

Я что-то упустил или это нарушает механизм политики выполнения? Зачем подписывать скрипты (что выглядит довольно хлопотно), когда вы можете просто сделать политику выполнения менее ограничительной?

Ниже приведен сценарий BAT, который я написал, который создает неподписанный файл ps1 и запускает его. Он работает на машине с политикой выполнения Restricted, которая должна запрещать скрипты. Контроль учетных записей включен, и запрос на повышение прав не отображается. Он даже подключается к Интернету и получает последний заголовок "Эй, сценарист!" блог.

echo write-host "`r`nPowershell code running on $(hostname).`r`n`r`nHere's the latest headline from the 'Hey, Scripting Guy!' blog: '$(([xml](New-Object Net.WebClient).DownloadString("http://blogs.technet.com/b/heyscriptingguy/atom.aspx")).feed.entry[0].title)'.`r`n`r`nPress Enter to close.`r`n"; read-host > script.ps1
powershell -ExecutionPolicy bypass -Command .\script.ps1

2 ответа

Решение

Политика выполнения не позволит кому-либо изменить существующий скрипт, который запускается кем-то другим, или как автоматизированный процесс (например, запланированное задание). С точки зрения безопасности, использование этого.bat-файла ничем не отличается от компиляции кода для выполнения того же действия в.exe-файле.

Кроме того, параметр -ExecutionPolicy не работает, когда политика выполнения задается с помощью локальной / групповой политики на компьютере (согласно комментарию Ансгара к этому вопросу).

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

  • Откройте любой скрипт, который вы хотите запустить в блокноте
  • Скопируйте содержимое в буфер обмена
  • Вставьте буфер обмена в экземпляр powershell

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

Другие вопросы по тегам