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 utilizar para aplicaciones heredadas con el fin de proporcionar seguridad de los recursos. Un proceso de la aplicación AppContainer y sus procesos secundarios se ejecutan en un contenedor de aplicaciones ligero al que solo pueden acceder los recursos que se les conceden específicamente. Y se aíslan mediante la virtualización del sistema de archivos y del registro. En consecuencia, las aplicaciones implementadas en AppContainer no se pueden piratear para permitir acciones malintencionadas fuera de los recursos asignados limitados.

Tanto para las aplicaciones empaquetadas como para las que no están en paquetes, AppContainer representa una buena práctica de ingeniería segura.

Sugerencia

Originalmente, AppContainer se denominó LowBox (antes del lanzamiento de Windows 8). Ese nombre heredado se puede ver en nombres de API como NtCreateLowBoxToken.

Aplicaciones empaquetadas

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

Aplicaciones sin empaquetar

Las aplicaciones sin empaquetar también se pueden ejecutar en un contenedor de aplicaciones. Para crear un proceso en un contenedor de aplicaciones, se necesita una definición (o un perfil) de AppContainer. Por eso es más fácil usar AppContainer con una aplicación empaquetada. Al registrar un paquete para un usuario, la pila de implementación llama a determinadas API de Win32 para que crear el perfil de AppContainer necesario (por ejemplo, CreateAppContainerProfile). Y cuando se anula el registro de un paquete para un usuario, la pila de implementación se encarga de quitar el perfil de AppContainer (DeleteAppContainerProfile). Si no va a empaquetar la aplicación, debe hacer lo mismo, pero debe llamar usted mismo a las API de Win32, algo que puede llegar a ser complicado.

La mayoría de las aplicaciones sin empaquetar que usaban el nivel de baja integración ahora usan AppContainer, ya que es una forma mejor 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 elevado/medio/bajo/appContainer. En cambio, estar o no en un contenedor de aplicaciones es una segunda propiedad ortogonal. Dicho eso, si está en un contenedor de aplicaciones, el nivel de integridad (IL) es siempre bajo.

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 y, al mismo tiempo, mantener la compatibilidad con otras aplicaciones. Para lograrlo, Windows detecta y redirige ciertos cambios que realiza en el sistema de archivos y en el registro en tiempo de ejecución (lo que se conoce como virtualización). Las aplicaciones de AppContainer escriben en su propia carpeta de datos de aplicación y registro virtual, y los datos se eliminan cuando la aplicación se desinstala o se restablece. Otras aplicaciones no tienen acceso al registro virtual o al sistema de archivos virtual de una aplicación de AppContainer.

Por consiguiente, el entorno de AppContainer proporciona un espacio aislado seguro de las aplicaciones. El aislamiento de la aplicación para que no pueda acceder al hardware, archivos, registro, otras aplicaciones, conectividad de red y recursos de red sin un permiso concreto. Se pueden asignar los destinos de los recursos individuales sin exponer otros recursos. Además, la identidad del usuario se protege mediante una identidad única, que es una concatenación del usuario y la aplicación; y los recursos se conceden mediante un modelo de privilegios mínimos. Esto ofrece mayor protección contra cualquier aplicación que suplante 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 los proyectos de C# o C++, puede usar el código de ejemplo adecuado de los que hay a continuación para determinar si un proceso se ejecuta en un contenedor de aplicaciones. En todos los ejemplos, después de ejecutar el código, si el valor de isAppContainer no es cero (o true), el proceso se ejecuta en 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 usan las bibliotecas de implementación de Windows (WIL)). Una forma de instalar WIL es ir a Visual Studio, hacer clic en Proyecto>Administrar paquetes de NuGet...>Examinar, escriba o pegue Microsoft.Windows.ImplementationLibrary en el cuadro de búsqueda, seleccione el elemento en los resultados de la búsqueda y luego 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 de control de errores alternativas. Consulte 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 más información sobre el uso de AppContainer para aplicaciones heredadas, consulte los siguientes temas.

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 tanto de los recursos innecesarios como de otras aplicaciones, se minimizan las oportunidades de manipulación malintencionada. El uso del modelo de privilegios mínimos para conceder acceso impide que las aplicaciones y los usuarios accedan a los recursos que están más allá de sus derechos. El control del acceso a los recursos protege el proceso, el dispositivo y la red.
Implementación de AppContainer Para implementar AppContainer, es preciso agregar nueva información al token de proceso y cambiar 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 asignar objetos ACL que deberían estar disponibles para AppContainers.