Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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_ALLOWEDWLDP_CAN_EXECUTE_BLOCKEDWLDP_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 permite que el archivo se use enFullLanguagemodo con algunas restricciones. -
WLDP_CAN_EXECUTE_BLOCKED: la directiva no permite 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 se puede ejecutar o cargar enConstrainedLanguagemodo.
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 modoFullLanguagecon algunas restricciones. -
Audit: el archivo se ejecuta o se carga en modoFullLanguagesin 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á bajo una Directiva de Bloqueo de Control de Aplicaciones, aplica restricciones incluso si el script es de confianza y se ejecuta en modo FullLanguage. 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
ConstrainedLanguagepara 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-PSHostProcessno permitidoEl cmdlet
Enter-PSHostProcessestá 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
Un script o una función no aprobada por la directiva de Control de aplicaciones 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-Typeno permitidoEl bloqueo de
Add-Typeimpide la ejecución de código arbitrario de .NET.cmdlet
Import-LocalizedDatarestringidoEl bloqueo del parámetro SupportedCommand de
Import-LocalizedDataimpide la ejecución de código arbitrario.cmdlet
Invoke-ExpressionrestringidoTodos los bloques de script pasados al cmdlet
Invoke-Expressionse ejecutan en modoConstrainedLanguagepara evitar la ejecución arbitraria de código.cmdlet
New-ObjectrestringidoEl cmdlet
New-Objectestá 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-ObjectLa invocación de método de tipo para las variables que se pasan a
ForeEach-Objectno se permite para cualquier tipo de .NET que no esté en la lista aprobada. En general, el modoConstrainedLanguageno 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-ModuleMemberEl uso del cmdlet
Export-ModuleMemberpara 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-ModuleCuando se ejecuta
New-Moduleen un script de confianza, cualquier bloque de scripts proporcionado por el parámetroScriptBlockse marca para ejecutarse en modoConstrainedLanguagea fin de evitar la inserción de código arbitrario en un contexto de ejecución de confianza.palabra clave
Configurationno permitidaLa palabra clave del lenguaje
Configurationno está permitida en modoConstrainedLanguagepara evitar ataques por inyección de código.palabra clave
classno permitidaNo se permite que la palabra clave de lenguaje
classesté en modoConstrainedLanguagepara 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
ConstrainedLanguagebloquea las conversiones de la tabla hash a objeto en las seccionesDatade 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
ConstrainedLanguagebloquea 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 modoConstrainedLanguagebloquea 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
AllScopeEl modo
ConstrainedLanguagedeshabilita la capacidad de establecerAllScopeen 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
ConstrainedLanguageno 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
ConstrainedLanguagerestringe 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
ConstrainedLanguagebloquea 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
ConstrainedLanguageno 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.