Funcionamiento de App Control con PowerShell
En este artículo se explica cómo App Control para empresas protege PowerShell y las restricciones que impone. El comportamiento seguro de PowerShell varía en función de la versión de Windows y PowerShell que use.
Cómo detecta PowerShell una directiva de bloqueo del sistema
PowerShell detecta las directivas en todo el sistema appLocker y App Control para empresas . AppLocker está en desuso. App Control es el sistema de control de aplicaciones preferido para Windows.
Detección de cumplimiento de directivas de Control de aplicaciones heredada
PowerShell usa la API de control de WldpGetLockdownPolicy
aplicaciones heredada para detectar dos cosas:
- Aplicación de directivas en todo el sistema:
None
,Audit
,Enforce
- Directiva de archivo individual:
None
,Audit
(permitida por directiva),Enforce
(no permitida por la directiva)
Todas las versiones de PowerShell (v5.1 - v7.x) admiten esta detección de directivas de Control de aplicaciones.
Detección más reciente de cumplimiento de directivas de Control de aplicaciones
App Control introdujo nuevas API en versiones recientes de Windows. A partir de la versión 7.3, PowerShell usa la nueva API WldpCanExecuteFile
para decidir cómo se debe controlar un archivo. Windows PowerShell 5.1 no admite esta nueva API. La nueva API tiene prioridad sobre la API heredada para archivos individuales.
Sin embargo, PowerShell sigue usando la API heredada para obtener la configuración de directiva en todo el sistema. Si la nueva API no está disponible, PowerShell vuelve al comportamiento anterior de la API.
La nueva API proporciona la siguiente información para cada archivo:
WLDP_CAN_EXECUTE_ALLOWED
WLDP_CAN_EXECUTE_BLOCKED
WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
Comportamiento de PowerShell en la directiva de bloqueo
PowerShell se puede ejecutar en modos interactivos y no interactivos.
- En el modo interactivo, PowerShell es una aplicación de línea de comandos que toma la entrada de la línea de comandos de los usuarios como comandos o scripts que se van a ejecutar. Los resultados se muestran de nuevo al usuario.
- En el modo no interactivo, PowerShell carga módulos y ejecuta archivos de script sin entrada de usuario. Los flujos de datos de resultados se omiten o se redirigen a un archivo.
Ejecución del modo interactivo en cumplimiento de directivas
PowerShell ejecuta comandos en modo ConstrainedLanguage
. Este modo impide que los usuarios interactivos ejecuten determinados comandos o ejecuten código arbitrario. Para obtener más información sobre las restricciones en este modo, consulte la sección Restricciones de PowerShell en la directiva de bloqueo de este artículo.
Ejecución del modo no interactivo en cumplimiento de directivas
Cuando PowerShell ejecuta un script o carga un módulo, usa la API de control de aplicaciones para obtener la aplicación de directivas para el archivo.
PowerShell versión 7.3 o posterior usa la API WldpCanExecuteFile
si está disponible. Esta API devuelve los siguientes resultados:
WLDP_CAN_EXECUTE_ALLOWED
: la directiva aprueba el archivo y este se usa en modoFullLanguage
con algunas restricciones.WLDP_CAN_EXECUTE_BLOCKED
: la directiva no aprueba el archivo. PowerShell genera un error cuando se ejecuta o se carga el archivo.WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
: la directiva no aprueba el archivo, pero este se puede ejecutar o cargar en modoConstrainedLanguage
.
En Windows PowerShell 5.1 o si la API WldpCanExecuteFile
no está disponible, el comportamiento de PowerShell por archivo es:
None
: el archivo se ejecuta en modoFullLanguage
con algunas restricciones.Audit
: el archivo se ejecuta o se carga en modoFullLanguage
sin restricciones. En PowerShell 7.4 o versiones posteriores, la directiva registra información sobre restricciones a los registros de eventos de Windows.Enforce
: el archivo se ejecuta o se carga en modoConstrainedLanguage
.
Restricciones de PowerShell en la directiva de bloqueo
Cuando PowerShell detecta que el sistema está en una directiva de bloqueo de Control de aplicaciones, aplica restricciones incluso si el script es de confianza y se ejecuta en FullLanguage
modo. Estas restricciones impiden comportamientos conocidos de PowerShell que podrían dar lugar a la ejecución arbitraria de código en un sistema bloqueado. La directiva de bloqueo aplica las siguientes restricciones:
Fijación de puntos del módulo con restricción de exportación de funciones comodín
Los módulos que usan la fijación de puntos del script y exportan funciones mediante nombres comodín producen un error. El bloqueo de exportaciones con caracteres comodín impide la inyección de scripts de un usuario malintencionado que puede generar un script que no es de confianza que obtiene el origen de puntos en un módulo de confianza. Después, el script malintencionado podría obtener acceso a las funciones privadas del módulo de confianza.
Recomendación de seguridad: nunca use la fijación de puntos de script en un módulo y exporte siempre funciones de módulo con nombres explícitos (sin caracteres comodín).
Módulo anidado con restricción de exportación de funciones comodín
Si un módulo primario exporta funciones con caracteres comodín de nombre de función, PowerShell elimina los nombres de función de un módulo anidado de la lista de exportación de funciones. El bloqueo de las exportaciones de caracteres comodín desde módulos anidados evita la exportación accidental de funciones anidadas peligrosas a través de la coincidencia de nombres comodín.
Recomendación de seguridad: Exporte siempre funciones de módulo con nombres explícitos (sin caracteres comodín).
Conversión del tipo de parámetro de shell interactivo
Cuando el sistema está bloqueado, las sesiones interactivas de PowerShell se ejecutan en modo
ConstrainedLanguage
para evitar la ejecución arbitraria de código. Los módulos de confianza cargados en la sesión se ejecutan en modoFullLanguage
. Si un cmdlet de módulo de confianza usa tipos complejos para sus parámetros, la conversión de tipos durante el enlace de parámetros puede producir un error si no se permite la conversión a través de límites de confianza. El error se produce cuando PowerShell intenta convertir un valor mediante la ejecución de un constructor de tipos. Los constructores de tipos no pueden ejecutarse en modoConstrainedLanguage
.En este ejemplo, normalmente se permite la conversión de tipos de enlace de parámetros, pero se produce un error cuando se ejecuta en modo
ConstrainedLanguage
. No se permite el constructor de tiposConnectionPort
:PS> Create-ConnectionOnPort -Connection 22 Create-ConnectionOnPort: Cannot bind parameter 'Connection'. Cannot convert the "22" value of type "System.Int32" to type "ConnectionPort".
cmdlet
Enter-PSHostProcess
no permitidoEl cmdlet
Enter-PSHostProcess
está deshabilitado y produce un error si se usa. Este comando se usa para las sesiones de adjuntos y depuración. Permite conectarse a cualquier otra sesión de PowerShell en el equipo local. El cmdlet está deshabilitado para evitar la divulgación de información y la ejecución arbitraria del código.
Restricciones de PowerShell en modo de lenguaje restringido
El script o la función que la directiva de control de aplicaciones no aprueba no es de confianza. Al ejecutar un comando que no es de confianza, PowerShell impide que el comando se ejecute (nuevo comportamiento) o ejecute el comando en modo ConstrainedLanguage
. Se aplican las restricciones que se indican a continuación al modo ConstrainedLanguage
:
cmdlet
Add-Type
no permitidoEl bloqueo de
Add-Type
impide la ejecución de código arbitrario de .NET.cmdlet
Import-LocalizedData
restringidoEl bloqueo del parámetro SupportedCommand de
Import-LocalizedData
impide la ejecución de código arbitrario.cmdlet
Invoke-Expression
restringidoTodos los bloques de script pasados al cmdlet
Invoke-Expression
se ejecutan en modoConstrainedLanguage
para evitar la ejecución arbitraria de código.cmdlet
New-Object
restringidoEl cmdlet
New-Object
está restringido a usar solo los tipos .NET y COM permitidos para evitar el acceso a tipos que no son de confianza.restricción de cmdlet
ForEach-Object
La invocación de método de tipo para las variables que se pasan a
ForeEach-Object
no se permite para cualquier tipo de .NET que no esté en la lista aprobada. En general, el modoConstrainedLanguage
no permite ninguna invocación de método de objeto, excepto los tipos de .NET aprobados para impedir el acceso a tipos de .NET que no son de confianza.restricción de cmdlet
Export-ModuleMember
El uso del cmdlet
Export-ModuleMember
para exportar funciones en un archivo de script de módulo anidado en el que el módulo secundario no es de confianza y el módulo primario es de confianza, se produce un error. Al bloquear este escenario, se impide que un módulo malintencionado que no sea de confianza exporte funciones peligrosas desde un módulo de confianza.restricción de cmdlet
New-Module
Cuando se ejecuta
New-Module
en un script de confianza, cualquier bloque de scripts proporcionado por el parámetroScriptBlock
se marca para ejecutarse en modoConstrainedLanguage
a fin de evitar la inserción de código arbitrario en un contexto de ejecución de confianza.palabra clave
Configuration
no permitidaLa palabra clave del lenguaje
Configuration
no está permitida en modoConstrainedLanguage
para evitar ataques por inyección de código.palabra clave
class
no permitidaNo se permite que la palabra clave de lenguaje
class
esté en modoConstrainedLanguage
para evitar la inyección de código arbitrario.Restricciones de ámbito de procesamiento de bloques de scripts
Los bloques de scripts secundarios no pueden ejecutarse en ámbitos de bloques de scripts primarios si los bloques de scripts tienen niveles de confianza diferentes. Por ejemplo, se crea una relación secundaria al utilizar el operador punto de un script en otro. Al bloquear este escenario, se impide que un script que no sea de confianza obtenga acceso a funciones peligrosas en el ámbito del script de confianza.
Prevención de la detección de comandos de funciones de script que no son de confianza
La detección de comandos de PowerShell no devuelve funciones de un origen que no es de confianza, como un script o módulo que no es de confianza, a una función de confianza. Al bloquear la detección de comandos que no son de confianza, se impide la inyección de código a través de la plantación de comandos.
No se permite la conversión de la tabla hash a objeto
El modo
ConstrainedLanguage
bloquea las conversiones de la tabla hash a objeto en las seccionesData
de archivos de datos de PowerShell (.psd1
) para evitar posibles ataques por inyección de código.Conversión automática de tipos restringida
El modo
ConstrainedLanguage
bloquea la conversión automática de tipos excepto un pequeño conjunto de tipos seguros aprobados para evitar posibles ataques por inyección de código.Restricción de exportación de funciones de módulo implícita
Si un módulo no exporta explícitamente funciones, PowerShell exporta implícitamente todas las funciones de módulo definidas automáticamente como una característica de conveniencia. En el modo
ConstrainedLanguage
, las exportaciones implícitas ya no se producen cuando se carga un módulo a través de los límites de confianza. El bloqueo de exportaciones implícitas impide la exposición no deseada de funciones de módulo peligrosas no pensadas para uso público.Los archivos de script no se pueden importar como módulos
PowerShell permite importar archivos de script (
.ps1
) como módulo. Todas las funciones definidas pasan a ser accesibles públicamente. El modoConstrainedLanguage
bloquea la importación del archivo de script para evitar la exposición no deseada de funciones de script peligrosas.Establecimiento de la restricción de variables
AllScope
El modo
ConstrainedLanguage
deshabilita la capacidad de establecerAllScope
en variables. Al limitar el ámbito de las variables, se impide que las variables interfieran con el estado de sesión de los comandos de confianza.No se permite la invocación de método de tipo
El modo
ConstrainedLanguage
no permite la invocación de métodos en tipos no aprobados. Al bloquear métodos en tipos no aprobados, se impide la invocación de métodos de tipo .NET que podrían ser peligrosos o permitir la inyección de código.No se permiten establecedores de propiedades de tipo
El modo
ConstrainedLanguage
restringe la invocación de establecedores de propiedades en tipos no aprobados. Al bloquear establecedores de propiedades en tipos no aprobados, se impiden ataques por inyección de código.No se permite la creación de tipos
El modo
ConstrainedLanguage
bloquea la creación de tipos en tipos no aprobados para bloquear constructores que no son de confianza que podrían permitir la inserción de código.Operador de ámbito de módulo no permitido
El modo
ConstrainedLanguage
no permite el uso del operador de ámbito del módulo. Por ejemplo:& (Get-Module MyModule) MyFunction
. El bloqueo del operador de ámbito del módulo impide el acceso a las funciones y variables privadas del módulo.
Información adicional
- Para obtener más información sobre los modos de lenguaje de PowerShell, consulte about_Language_Modes.
- Para obtener información sobre cómo configurar y usar El control de aplicaciones, consulte Uso del control de aplicaciones para PowerShell.