Compartir a través de


AppContainer para aplicaciones heredadas

El entorno de AppContainer es un entorno de ejecución de procesos restrictivo que se puede usar para las aplicaciones heredadas con el fin de proporcionar seguridad de los recursos. Un proceso de la aplicación AppContainer y sus procesos secundarios se ejecutan dentro de un contenedor de aplicaciones ligero donde solo pueden acceder a los recursos que se les conceden específicamente. Y están aislados mediante el sistema de archivos y la virtualización del registro. Como resultado, las aplicaciones implementadas en un AppContainer no se pueden hackear para permitir acciones malintencionadas fuera de los recursos asignados limitados.

Para las aplicaciones empaquetadas y sin empaquetar, AppContainer representa una buena práctica de ingeniería segura.

Propina

AppContainer se llamaba originalmente LowBox (antes de la versión de Windows 8). Ese nombre heredado se puede ver en nombres de API como NtCreateLowBoxToken.

Aplicaciones empaquetadas

Puede tomar una aplicación empaquetada mediante MSIX y configurarla fácilmente para que se ejecute en el entorno de AppContainer. Las aplicaciones de la Plataforma universal de Windows (UWP) son aplicaciones appContainer automáticamente. Pero también puede configurar la aplicación de escritorio empaquetada con MSIX para que sea una aplicación AppContainer. Es especialmente fácil usar AppContainer si empaqueta con MSIX. Para obtener más información, escenarios y ejemplos de configuración, consulte aplicaciones de MSIX AppContainer.

Aplicaciones sin empaquetar

Una aplicación desempaquetada también se puede ejecutar en un contenedor de aplicaciones. Para crear un proceso en un contenedor de aplicaciones, necesita una definición de AppContainer (o perfil). Y por eso el uso de AppContainer con una aplicación empaquetada es más fácil. Al registrar un paquete para un usuario, la pila de implementación llama a determinadas API de Win32 para poder crear el perfil de AppContainer necesario (por ejemplo, CreateAppContainerProfile). Y al anular el registro de un paquete para un usuario, la pila de implementación realiza el trabajo para quitar el perfil de AppContainer (DeleteAppContainerProfile). Si no empaquetas la aplicación, debes hacer lo mismo llamando a esas API de Win32 tú mismo; pero puede ser complicado.

La mayoría de las aplicaciones sin empaquetar que usaban el nivel de baja integración ahora usan AppContainer como una mejor manera de proporcionar un entorno de ejecución restringido.

Cuando un proceso sin empaquetar que se ejecuta en un contenedor de aplicaciones llama a CreateProcess, el proceso secundario suele heredar el token del elemento primario. Ese token incluye el nivel de integridad (IL) y la información del contenedor de aplicaciones. Es mejor no pensar en un solo eje con los valores elevados, medio, bajo o appContainer en él. En su lugar, ser o no estar en un contenedor de aplicaciones es una segunda propiedad ortogonal. Dicho esto, si se en un contenedor de aplicaciones, el nivel de integridad (IL) siempre se baja.

Ventajas de usar un entorno de AppContainer

Un objetivo clave del entorno de AppContainer es separar el estado de la aplicación del estado del sistema tanto como sea posible, al tiempo que se mantiene la compatibilidad con otras aplicaciones. Windows logra que mediante la detección y redirección de determinados cambios que realice en el sistema de archivos y el registro en tiempo de ejecución (conocido como virtualizar). Una aplicación AppContainer escribe en su propia carpeta de datos de aplicación y registro virtual, y esos datos se eliminan cuando la aplicación se desinstala o restablece. Otras aplicaciones no tienen acceso al registro virtual ni al sistema de archivos virtual de una aplicación AppContainer.

Por lo tanto, el entorno de AppContainer proporciona un espacio aislado seguro de las aplicaciones. Aislar la aplicación del acceso al hardware, los archivos, el registro, otras aplicaciones, la conectividad de red y los recursos de red sin permiso específico. Los recursos individuales se pueden destinar sin exponer otros recursos. Además, la identidad de usuario está protegida mediante una identidad única que es una concatenación del usuario y la aplicación; y se conceden recursos mediante un modelo con privilegios mínimos. Esto protege aún más contra una aplicación que suplanta al usuario para obtener acceso a otros recursos.

Código de ejemplo que se va a probar para ejecutarse en un contenedor de aplicaciones

En un proyecto de C# o C++, puede usar uno de los ejemplos de código adecuados a continuación para determinar si un proceso se ejecuta dentro de un contenedor de aplicaciones. Para cada ejemplo, después de ejecutar el código, si el valor de isAppContainer es distinto de cero (o true), el proceso se ejecuta dentro de un contenedor de aplicaciones.

C# (P/Invoke)

[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GetCurrentProcess();

[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool OpenProcessToken(
    IntPtr ProcessHandle,
    UInt32 DesiredAccess,
    out IntPtr TokenHandle);

[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetTokenInformation(
    IntPtr TokenHandle,
    uint TokenInformationClass,
    out uint TokenInformation,
    uint TokenInformationLength,
    out uint ReturnLength);

UInt32 TOKEN_QUERY = 0x0008;
IntPtr tokenHandle;

if (!OpenProcessToken(
    GetCurrentProcess(),
    TOKEN_QUERY,
    out tokenHandle))
{
    // Handle the error.
}

uint isAppContainer;
uint TokenIsAppContainer = 29;
uint tokenInformationLength = sizeof(uint);

if (!GetTokenInformation(
    tokenHandle,
    TokenIsAppContainer,
    out isAppContainer,
    tokenInformationLength,
    out tokenInformationLength))
{
    // Handle the error.
}

C++ (WIL)

En este ejemplo se usa bibliotecas de implementación de Windows (WIL)). Una manera cómoda de instalar WIL es ir a Visual Studio, hacer clic en Proyecto>Administrar paquetes NuGet...>Examinar, escriba o pegue Microsoft.Windows.ImplementationLibrary en el cuadro de búsqueda, seleccione el elemento en los resultados de búsqueda y, a continuación, haga clic en Instalar para instalar el paquete para ese proyecto.

#include <wil\token_helpers.h>
...
bool isAppContainer = wil::get_token_is_app_container();

Las funciones wil::get_token_is_app_container_nothrow y wil::get_token_is_app_container_failfast ofrecen estrategias alternativas de control de errores. Consulta wil\token_helpers.h para obtener más información.

C++ (canónico)

#include <windows.h>
...
HANDLE tokenHandle{};
DWORD isAppContainer{};
DWORD tokenInformationLength{ sizeof(DWORD) };

if (!::OpenProcessToken(
    GetCurrentProcess(),
    TOKEN_QUERY,
    &tokenHandle))
{
    // Handle the error.
}

if (!::GetTokenInformation(
    tokenHandle,
    TOKEN_INFORMATION_CLASS::TokenIsAppContainer,
    &isAppContainer,
    tokenInformationLength,
    &tokenInformationLength
))
{
    // Handle the error.
}

En esta sección

Para obtener más información sobre el uso de AppContainer para aplicaciones heredadas, consulte los temas siguientes.

Tema Descripción
aislamiento de AppContainer El aislamiento es el objetivo principal de un entorno de ejecución de AppContainer. Al aislar una aplicación de recursos innecesarios y otras aplicaciones, se minimizan las oportunidades de manipulación malintencionada. Conceder acceso basado en privilegios mínimos impide que las aplicaciones y los usuarios accedan a los recursos más allá de sus derechos. Controlar el acceso a los recursos protege el proceso, el dispositivo y la red.
Implementación de un appContainer Un AppContainer se implementa agregando nueva información al token de proceso, cambiando SeAccessCheck() para que todos los objetos heredados y sin modificar la lista de control de acceso (ACL) bloqueen las solicitudes de acceso de los procesos de AppContainer de forma predeterminada y vuelvan a incluir objetos ACL que deberían estar disponibles para AppContainers.