AppContainer para aplicativos herdados

O ambiente do AppContainer é um ambiente restritivo de execução de processo que pode ser usado para aplicativos herdados a fim de fornecer segurança de recursos. O processo de um aplicativo AppContainer e seus processos filho são executados dentro de um contêiner de aplicativo leve, onde eles podem acessar apenas os recursos que são especificamente concedidos a eles. E eles são isolados usando o sistema de arquivos e a virtualização do registro. Como resultado, os aplicativos implementados em um AppContainer não podem ser invadidos para permitir ações mal-intencionadas fora dos recursos atribuídos limitados.

Para aplicativos empacotados e não empacotados, o AppContainer representa uma prática de engenharia boa e segura.

Dica

O AppContainer se chamava LowBox originalmente (antes do lançamento do Windows 8). Esse nome herdado pode ser visto em nomes de API, como NtCreateLowBoxToken.

Aplicativos empacotados

Você pode pegar um aplicativo empacotado usando MSIX e configurá-lo facilmente para ser executado no ambiente do AppContainer. Os aplicativos da Plataforma Universal do Windows (UWP) são automaticamente aplicativos AppContainer. Mas você também pode configurar seu aplicativo da área de trabalho empacotado com MSIX para ser um aplicativo AppContainer. É particularmente fácil usar o AppContainer se você empacotar usando o MSIX. Para obter mais informações, cenários e exemplos de configuração, consulte Aplicativos AppContainer MSIX.

Aplicativos não empacotados

Um aplicativo não empacotado também pode ser executado em um contêiner de aplicativo. Para criar um processo em um contêiner de aplicativo, você precisa de uma definição (ou perfil) do AppContainer. E é por isso que usar o AppContainer com um aplicativo empacotado é mais fácil. Quando você registra um pacote para um usuário, a pilha de implantação chama determinadas APIs Win32 para você a fim de criar o perfil do AppContainer necessário (por exemplo, CreateAppContainerProfile). E quando você cancela o registro de um pacote para um usuário, a pilha de implantação trabalha para remover o perfil do AppContainer (DeleteAppContainerProfile). Se você não for empacotar seu aplicativo, precisará fazer as mesmas coisas chamando essas APIs Win32 você mesmo; mas pode ser complicado.

A maioria dos aplicativos não empacotados que usavam o nível de integridade baixo agora usam o AppContainer como uma maneira melhor de fornecer um ambiente de execução restrito.

Quando um processo não empacotado em execução em um contêiner de aplicativo chama CreateProcess, o processo filho normalmente herda o token do pai. Esse token inclui o nível de integridade e as informações do contêiner do aplicativo. É melhor não pensar em um único exito com os valores elevado/médio/baixo/appContainer nele. Em vez disso, estar ou não estar em um contêiner de aplicativo é uma segunda propriedade ortogonal. Dito isso, se você estiver em um contêiner de aplicativo, o nível de integridade será sempre baixo.

Benefícios do uso de um ambiente do AppContainer

Um dos principais objetivos do ambiente do AppContainer é separar o estado do aplicativo do estado do sistema tanto quanto possível enquanto mantém a compatibilidade com outros aplicativos. O Windows faz isso detectando e redirecionando determinadas alterações feitas no sistema de arquivos e no registro em runtime (conhecido como virtualização). Um aplicativo AppContainer grava em seu próprio registro virtual e na pasta de dados do aplicativo, e esses dados serão excluídos quando o aplicativo for desinstalado ou redefinido. Outros aplicativos não têm acesso ao registro virtual ou ao sistema de arquivos virtual de um aplicativo AppContainer.

Portanto, o ambiente do AppContainer fornece área restrita segura de aplicativos. Isolar o aplicativo de acessar hardware, arquivos, registro, outros aplicativos, conectividade de rede e recursos de rede sem permissão específica. Recursos individuais podem ser direcionados sem expor outros recursos. Além disso,a identidade do usuário é protegida usando uma identidade exclusiva que é uma concatenação do usuário e do aplicativo; os recursos são concedidos usando um modelo de privilégios mínimos. Isso protege ainda mais contra um aplicativo que se passa pelo usuário para obter acesso a outros recursos.

Código de exemplo a ser testado para execução em um contêiner de aplicativo

Em um projeto C# ou C++, você pode usar um dos exemplos de código apropriados abaixo para determinar se um processo está ou não em execução dentro de um aplicativo de contêiner. Para cada exemplo, depois que o código for executado, se o valor de isAppContainer for diferente de zero (ou true), o processo será executado dentro de um contêiner de aplicativo.

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)

Este exemplo usa as Bibliotecas de Implementação do Windows (WIL). Uma maneira conveniente de instalar o WIL é acessar o Visual Studio, clicar em Projeto>Gerenciar Pacotes NuGet...>Procurar, digitar ou colar Microsoft.WIndows.ImplementationLibrary na caixa de pesquisa, selecionar o item nos resultados da pesquisa e clicar em Instalar para instalar o pacote para esse projeto.

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

As funções wil::get_token_is_app_container_nothrow e wil::get_token_is_app_container_failfast oferecem estratégias alternativas de tratamento de erros. Confira wil\token_helpers.h para obter mais informações.

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.
}

Nesta seção

Para obter mais informações sobre como usar o AppContainer para aplicativos herdados, consulte os tópicos a seguir.

Tópico Descrição
Isolamento do AppContainer Isolamento é a meta principal de um ambiente de execução do AppContainer. Ao isolar um aplicativo de recursos desnecessários e outros aplicativos, as oportunidades de manipulação mal-intencionada são minimizadas. A concessão de acesso com base no privilégio mínimo impede que aplicativos e usuários acessem recursos além de seus direitos. O controle do acesso aos recursos protege o processo, o dispositivo e a rede.
Implementar um AppContainer Um AppContainer é implementado adicionando novas informações ao token de processo, alterando SeAccessCheck() para que todos os objetos ACL (lista de controle de acesso) herdados e não modificados bloqueiem solicitações de acesso de processos do AppContainer por padrão e objetos re-ACL que devem estar disponíveis para AppContainer.