AppContainer für Legacy-Apps

Die AppContainer-Umgebung ist eine restriktive Prozessausführungsumgebung, die für Legacy-Apps verwendet werden kann, um Ressourcensicherheit bereitzustellen. Der Prozess einer AppContainer-App und seine untergeordneten Prozesse werden in einem einfachen App-Container ausgeführt, in dem sie nur auf die Ressourcen zugreifen können, die ihnen speziell gewährt werden. Und sie sind isoliert mit Dateisystem- und Registrierungsvirtualisierung. Daher können Apps, die in einem AppContainer implementiert sind, nicht gehackt werden, um bösartige Aktionen außerhalb der begrenzten zugewiesenen Ressourcen zu ermöglichen.

Für verpackte und entpackte Apps stellt AppContainer eine gute, sichere Technik dar.

Tipp

AppContainer hieß ursprünglich LowBox (vor der Veröffentlichung von Windows 8). Dieser Legacyname kann in API-Namen wie NtCreateLowBoxToken angezeigt werden.

App-Pakete

Sie können eine App verwenden, die mit MSIX verpackt ist, und sie ganz einfach so konfigurieren, dass sie in der AppContainer-Umgebung ausgeführt wird. Universelle Windows-Plattform(UWP)-Apps sind automatisch AppContainer-Apps. Sie können aber auch Ihre Desktop-App, die mit MSIX verpackt ist, als AppContainer-App konfigurieren. Die Verwendung von AppContainer ist besonders einfach, wenn Sie MSIX verwenden. Weitere Informationen, Szenarien und Konfigurationsbeispiele finden Sie unter MSIX AppContainer-Apps.

Nicht gepackte Apps

Eine entpackte App kann auch in einem App-Container ausgeführt werden. Zum Erstellen eines Prozesses in einem App-Container benötigen Sie eine AppContainer-Definition (oder ein Profil). Aus diesem Grund ist die Verwendung von AppContainer mit einer verpackten App einfacher. Wenn Sie ein Paket für einen Benutzer registrieren, ruft der Bereitstellungsstapel bestimmte Win32-APIs für Sie auf, um das erforderliche AppContainer-Profil zu erstellen (z. B. CreateAppContainerProfile). Und wenn Sie die Registrierung eines Pakets für einen Benutzer aufheben, entfernt der Bereitstellungsstapel das AppContainer-Profil (DeleteAppContainerProfile). Wenn Sie Ihre App nicht verpacken, müssen Sie dieselben Aktionen ausführen, indem Sie diese Win32-APIs selbst aufrufen. Das kann jedoch kompliziert sein.

Die meisten entpackten Apps, die die niedrige Integrationsebene verwendet haben, verwenden jetzt AppContainer als bessere Möglichkeit, eine eingeschränkte Ausführungsumgebung bereitzustellen.

Wenn ein entpackter Prozess, der in einem App-Container ausgeführt wird, CreateProcess aufruft, erbt der untergeordnete Prozess in der Regel das Token des übergeordneten Elements. Dieses Token enthält die Integritätsstufe (IL) und App-Containerinformationen. Am besten stellen Sie sich nicht eine einzelne Achse mit den Werten erhöht/mittel/niedrig/appContainer vor. Stattdessen ist das Sein oder Nichtsein in einem App-Container eine zweite und orthogonale Eigenschaft. Das heißt, wenn Sie in einem App-Container sind, ist die Integritätsebene (IL) immer niedrig.

Vorteile der Verwendung einer AppContainer-Umgebung

Ein wichtiges Ziel der AppContainer-Umgebung besteht darin, den Appzustand vom Systemzustand bestmöglich zu trennen und dabei die Kompatibilität mit anderen Apps aufrechtzuerhalten. Windows erreicht dies, indem bestimmte Änderungen erkannt und umgeleitet werden, die es am Dateisystem und der Registrierung zur Laufzeit (als Virtualisierung bezeichnet) vorgibt. Eine AppContainer-App schreibt in ihre eigene virtuelle Registrierung und in den Ordner für Anwendungsdaten, und diese Daten werden gelöscht, wenn die App deinstalliert oder zurückgesetzt wird. Andere Apps haben keinen Zugriff auf die virtuelle Registrierung oder das virtuelle Dateisystem einer AppContainer-App.

Daher ermöglicht die AppContainer-Umgebung sicheres Sandboxing von Apps. Isolieren der App vom Zugriff auf Hardware, Dateien, Registrierung, andere Apps, Netzwerkkonnektivität und Netzwerkressourcen ohne bestimmte Berechtigung. Einzelne Ressourcen können gezielt angesprochen werden, ohne andere Ressourcen verfügbar zu machen. Darüber hinaus wird die Benutzeridentität durch eine eindeutige Identität geschützt, die eine Verkettung von Benutzer und App ist, und Ressourcen werden nach dem Modell der geringsten Rechte vergeben. Das schützt auch davor, dass eine App sich als Benutzer ausgibt, um Zugriff auf andere Ressourcen zu erhalten.

Beispielcode zum Testen der Ausführung in einem App-Container

In einem C#- oder C++-Projekt können Sie anhand der entsprechenden Codebeispiele ermitteln, ob ein Prozess innerhalb eines App-Containers ausgeführt wird. Wenn der Wert von isAppContainer nicht null (oder true) ist, wird der Prozess in einem App-Container ausgeführt, nachdem der Code ausgeführt wurde.

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)

In diesem Beispiel werden die Windows-Implementierungsbibliotheken (WIL) verwendet. Eine bequeme Möglichkeit zum Installieren von WIL besteht darin, zu Visual Studio zu wechseln. Klicken Sie auf Projekt>NuGet-Pakete verwalten...>Durchsuchen, oder geben oder fügen Sie Microsoft.Windows.ImplementationLibrary in das Suchfeld ein. Wählen Sie das Element in den Suchergebnissen aus, und klicken Sie dann auf Installieren, um das Paket für dieses Projekt zu installieren.

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

Die Funktionen wil::get_token_is_app_container_nothrow und wil::get_token_is_app_container_failfast bieten alternative Fehlerbehandlungsstrategien. Weitere Informationen finden Sie unter wil\token_helpers.h.

C++ (kanonisch)

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

In diesem Abschnitt

Weitere Informationen zur Verwendung von AppContainer für Legacy-Apps finden Sie in den folgenden Themen.

Thema Beschreibung
AppContainer-Isolation Isolation ist das primäre Ziel einer AppContainer-Ausführungsumgebung. Durch das Isolieren einer App aus nicht benötigten Ressourcen und anderen Apps werden Möglichkeiten für böswillige Manipulationen minimiert. Die Gewährung des Zugriffs auf der Grundlage der geringsten Rechte verhindert, dass Apps und Benutzer über ihre Rechte hinaus auf Ressourcen zugreifen. Die Steuerung des Zugriffs auf Ressourcen schützt den Prozess, das Gerät und das Netzwerk.
Implementieren eines AppContainers Ein AppContainer wird implementiert, indem dem Prozesstoken neue Informationen hinzugefügt, SeAccessCheck() ändert, sodass alle unmodifizierten Legacy-Zugriffssteuerungslistenobjekte standardmäßig Zugriffsanforderungen von AppContainer-Prozessen blockieren und für Objekte, die für AppContainers verfügbar sein sollten, die Zugriffssteuerungsliste (ACL) erneut aufrufen.