Compartir a través de


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 modo FullLanguage 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 modo ConstrainedLanguage.

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 modo FullLanguage con algunas restricciones.
  • Audit: el archivo se ejecuta o se carga en modo FullLanguage 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 modo ConstrainedLanguage.

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 modo FullLanguage. 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 modo ConstrainedLanguage.

    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 tipos ConnectionPort:

    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 permitido

    El 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 permitido

    El bloqueo de Add-Type impide la ejecución de código arbitrario de .NET.

  • cmdlet Import-LocalizedData restringido

    El bloqueo del parámetro SupportedCommand de Import-LocalizedData impide la ejecución de código arbitrario.

  • cmdlet Invoke-Expression restringido

    Todos los bloques de script pasados al cmdlet Invoke-Expression se ejecutan en modo ConstrainedLanguage para evitar la ejecución arbitraria de código.

  • cmdlet New-Object restringido

    El 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 modo ConstrainedLanguage 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ámetro ScriptBlock se marca para ejecutarse en modo ConstrainedLanguage a fin de evitar la inserción de código arbitrario en un contexto de ejecución de confianza.

  • palabra clave Configuration no permitida

    La palabra clave del lenguaje Configuration no está permitida en modo ConstrainedLanguage para evitar ataques por inyección de código.

  • palabra clave class no permitida

    No se permite que la palabra clave de lenguaje class esté en modo ConstrainedLanguage 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 secciones Data 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 modo ConstrainedLanguage 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 establecer AllScope 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