AppContainer per le app legacy

L'ambiente AppContainer è un ambiente di esecuzione di processi restrittivo che può essere usato per le app legacy per garantire la sicurezza delle risorse. Il processo di un'app AppContainer e i relativi processi figlio vengono eseguiti all'interno di un contenitore di app leggero in cui possono accedere solo alle risorse concesse in modo specifico. E sono isolati usando il file system e la virtualizzazione del Registro di sistema. Di conseguenza, le app implementate in un AppContainer non possono essere compromesse per consentire azioni dannose al di fuori delle risorse assegnate limitate.

Sia per le app in pacchetto che per le app non in pacchetto, AppContainer rappresenta una buona pratica di progettazione sicura.

Suggerimento

AppContainer è stato originariamente denominato LowBox (prima del rilascio di Windows 8). Tale nome legacy può essere visualizzato nei nomi api, ad esempio NtCreateLowBoxToken.

App in pacchetto

È possibile creare un'app in pacchetto usando MSIX e configurarla facilmente per l'esecuzione nell'ambiente AppContainer. le app piattaforma UWP (Universal Windows Platform) (UWP) vengono automaticamente app AppContainer. Ma puoi anche configurare l'app desktop in pacchetto con MSIX come app AppContainer. È particolarmente facile usare AppContainer se si usa MSIX. Per altre info, scenari ed esempi di configurazione, vedi App MSIX AppContainer.

App non in pacchetto

Un'app non in pacchetto può essere eseguita anche in un contenitore di app. Per creare un processo in un contenitore di app, è necessaria una definizione AppContainer (o un profilo). E questo è il motivo per cui l'uso di AppContainer con un'app in pacchetto è più semplice. Quando si registra un pacchetto per un utente, lo stack di distribuzione chiama alcune API Win32 per creare il profilo AppContainer necessario, ad esempio CreateAppContainerProfile. Quando si annulla la registrazione di un pacchetto per un utente, lo stack di distribuzione esegue il lavoro per rimuovere il profilo AppContainer (DeleteAppContainerProfile). Se non si crea il pacchetto dell'app, è necessario eseguire le stesse operazioni chiamando manualmente le API Win32; ma può essere complicato.

La maggior parte delle app senza pacchetti che usavano il livello di integrità basso ora usa AppContainer come modo migliore per fornire un ambiente di esecuzione vincolato.

Quando un processo non in pacchetto in esecuzione in un contenitore di app chiama CreateProcess, il processo figlio eredita in genere il token dell'elemento padre. Tale token include il livello di integrità (IL) e le informazioni sul contenitore dell'app. È consigliabile non pensare a un singolo asse con i valori elevati,medio/basso/appContainer. In alternativa, l'essere o meno in un contenitore di app è una seconda proprietà ortogonale. Detto questo, se ci si trova in un contenitore di app, il livello di integrità (IL) è sempre basso.

Vantaggi dell'uso di un ambiente AppContainer

L'obiettivo principale dell'ambiente AppContainer è separare lo stato dell'app dallo stato del sistema il più possibile, mantenendo al contempo la compatibilità con altre app. Windows esegue questa operazione rilevando e reindirizzando determinate modifiche apportate al file system e al Registro di sistema in fase di esecuzione (nota come virtualizzazione). Un'app AppContainer scrive nel proprio registro virtuale e nella cartella dei dati dell'applicazione e questi dati vengono eliminati quando l'app viene disinstallata o reimpostata. Altre app non hanno accesso al Registro di sistema virtuale o al file system virtuale di un'app AppContainer.

L'ambiente AppContainer offre quindi sandboxing sicuro delle app. Isolare l'app dall'accesso a hardware, file, registro, altre app, connettività di rete e risorse di rete senza autorizzazioni specifiche. Le singole risorse possono essere destinate senza esporre altre risorse. Inoltre, l'identità utente è protetta usando un'identità univoca che è una concatenazione dell'utente e dell'app; e le risorse vengono concesse usando un modello con privilegi minimi. Che protegge ulteriormente da un'app che rappresenta l'utente per ottenere l'accesso ad altre risorse.

Codice di esempio da testare per l'esecuzione in un contenitore di app

In un progetto C# o C++ è possibile usare uno degli esempi di codice appropriati seguenti per determinare se un processo è in esecuzione all'interno di un contenitore di app. Per ogni esempio, dopo l'esecuzione del codice, se il valore di isAppContainer è diverso da zero (o true), il processo viene eseguito all'interno di un contenitore di app.

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)

Questo esempio usa le librerie di implementazione di Windows (WIL)). Un modo pratico per installare WIL consiste nel passare a Visual Studio, fare clic su Project>Manage NuGet Packages (Gestisci pacchetti NuGet).>Sfoglia, digita o incolla Microsoft.Windows.ImplementationLibrary nella casella di ricerca, seleziona l'elemento nei risultati della ricerca e quindi fai clic su Installa per installare il pacchetto per il progetto.

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

Le funzioni wil::get_token_is_app_container_nothrow e wil::get_token_is_app_container_failfast offrono strategie alternative di gestione degli errori. Per altre info, vedi wil\token_helpers.h .

C++ (canonico)

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

Contenuto della sezione

Per altre informazioni sull'uso di AppContainer per le app legacy, vedere gli argomenti seguenti.

Argomento Descrizione
Isolamento appContainer L'isolamento è l'obiettivo principale di un ambiente di esecuzione AppContainer. Isolando un'app da risorse non necessarie e altre app, le opportunità di manipolazione dannosa vengono ridotte al minimo. La concessione dell'accesso in base al privilegio minimo impedisce alle app e agli utenti di accedere alle risorse oltre i propri diritti. Il controllo dell'accesso alle risorse protegge il processo, il dispositivo e la rete.
Implementare un AppContainer Un Oggetto AppContainer viene implementato aggiungendo nuove informazioni al token di processo, modificando SeAccessCheck() in modo che tutti gli oggetti ACL (Legacy, Unmodified Access Control List) blocchino le richieste di accesso dai processi AppContainer per impostazione predefinita e re-ACL oggetti che devono essere disponibili per AppContainers.