Udostępnij przez


Aplikacja AppContainer dla starszych aplikacji

Środowisko AppContainer to restrykcyjne środowisko wykonywania procesów, które może być używane dla starszych aplikacji w celu zapewnienia zabezpieczeń zasobów. Proces aplikacji AppContainer i jej procesy podrzędne są uruchamiane wewnątrz uproszczonego kontenera aplikacji, w którym mogą uzyskiwać dostęp tylko do zasobów, które zostały im przyznane. Są one izolowane przy użyciu systemu plików i wirtualizacji rejestru. W związku z tym aplikacje zaimplementowane w aplikacji AppContainer nie mogą zostać zhakowane, aby umożliwić złośliwe działania poza ograniczonymi przypisanymi zasobami.

Zarówno w przypadku spakowanych, jak i rozpakowanych aplikacji aplikacja AppContainer reprezentuje dobrą, bezpieczną praktykę inżynieryjną.

Napiwek

AppContainer został pierwotnie nazwany LowBox (przed wydaniem systemu Windows 8). Starsza nazwa może być widoczna w nazwach interfejsów API, takich jak NtCreateLowBoxToken.

Spakowane aplikacje

Możesz użyć aplikacji spakowanej przy użyciu pliku MSIX i łatwo skonfigurować ją do uruchamiania w środowisku AppContainer. Aplikacje platformy uniwersalnej systemu Windows (UWP) są automatycznie aplikacjami AppContainer. Możesz jednak również skonfigurować aplikację klasyczną spakowana za pomocą pliku MSIX jako aplikację AppContainer. Szczególnie łatwo jest używać aplikacji AppContainer, jeśli pakiet jest używany przy użyciu pliku MSIX. Aby uzyskać więcej informacji, scenariuszy i przykładów konfiguracji, zobacz aplikacje MSIX AppContainer.

Rozpakowane aplikacje

Rozpakowana aplikacja może również działać w kontenerze aplikacji. Aby utworzyć proces w kontenerze aplikacji, potrzebujesz definicji aplikacji AppContainer (lub profilu). Dlatego korzystanie z aplikacji AppContainer z spakowanym aplikacją jest łatwiejsze. Podczas rejestrowania pakietu dla użytkownika stos wdrożenia wywołuje pewne interfejsy API Win32, aby utworzyć niezbędny profil aplikacji AppContainer (na przykład CreateAppContainerProfile). A gdy wyrejestrujesz pakiet dla użytkownika, stos wdrożenia wykonuje pracę w celu usunięcia profilu AppContainer (DeleteAppContainerProfile). Jeśli nie pakujesz aplikacji, musisz wykonać te same czynności, wywołując te interfejsy API Win32 samodzielnie; ale może to być skomplikowane.

Większość rozpakowanych aplikacji, które korzystały z niskiego poziomu integrily, używa teraz usługi AppContainer jako lepszego sposobu zapewnienia ograniczonego środowiska wykonawczego.

Gdy rozpakowany proces uruchomiony w kontenerze aplikacji wywołuje CreateProcess, proces podrzędny zwykle dziedziczy token elementu nadrzędnego. Ten token zawiera informacje o poziomie integralności (IL) i kontenerze aplikacji. Najlepiej nie myśleć o jednej osi z wartościami podwyższonym/średnim/niskim/appContainer. Zamiast tego bycie w kontenerze aplikacji jest drugą i ortogonalną właściwością. Oznacza to, że jeśli w kontenerze aplikacji, poziom integralności (IL) jest zawsze niski.

Zalety korzystania ze środowiska AppContainer

Kluczowym celem środowiska AppContainer jest oddzielenie stanu aplikacji od stanu systemu tak bardzo, jak to możliwe, przy zachowaniu zgodności z innymi aplikacjami. System Windows pozwala wykrywać i przekierowywać pewne zmiany wprowadzone w systemie plików i rejestrze w czasie wykonywania (nazywanym wirtualizacją). Aplikacja AppContainer zapisuje w swoim własnym folderze danych rejestru wirtualnego i aplikacji, a dane te są usuwane po odinstalowaniu lub zresetowaniu aplikacji. Inne aplikacje nie mają dostępu do rejestru wirtualnego ani wirtualnego systemu plików aplikacji AppContainer.

Dlatego środowisko AppContainer zapewnia bezpieczne piaskownice aplikacji. Izolowanie aplikacji od uzyskiwania dostępu do sprzętu, plików, rejestru, innych aplikacji, łączności sieciowej i zasobów sieciowych bez określonych uprawnień. Poszczególne zasoby mogą być ukierunkowane bez uwidaczniania innych zasobów. Ponadto tożsamość użytkownika jest chroniona przy użyciu unikatowej tożsamości, która jest łączeniem użytkownika i aplikacji; zasoby i są przyznawane przy użyciu modelu najniższych uprawnień. To dodatkowo chroni przed aplikacją personifikując użytkownika w celu uzyskania dostępu do innych zasobów.

Przykładowy kod do testowania pod kątem uruchamiania w kontenerze aplikacji

W projekcie C# lub C++ możesz użyć odpowiedniego przykładu kodu poniżej, aby określić, czy proces jest uruchomiony wewnątrz kontenera aplikacji. Dla każdego przykładu, po uruchomieniu kodu, jeśli wartość isAppContainer jest inna niż zero (lub true), proces jest uruchamiany wewnątrz kontenera aplikacji.

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)

W tym przykładzie użyto bibliotek implementacji systemu Windows (WIL)). Wygodnym sposobem zainstalowania narzędzia WIL jest przejście do programu Visual Studio, kliknięcie project>Manage NuGet Packages...>Browse, wpisz lub wklej Microsoft.Windows.ImplementationLibrary w polu wyszukiwania, wybierz element w wynikach wyszukiwania, a następnie kliknij Zainstaluj, aby zainstalować pakiet dla tego projektu.

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

Funkcje wil::get_token_is_app_container_nothrow i wil::get_token_is_app_container_failfast oferują alternatywne strategie obsługi błędów. Aby uzyskać więcej informacji, zobacz wil\token_helpers.h.

C++ (kanoniczny)

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

W tej sekcji

Aby uzyskać więcej informacji na temat korzystania z aplikacji AppContainer dla starszych aplikacji, zobacz następujące tematy.

Temat Opis
izolacji AppContainer Izolacja jest głównym celem środowiska wykonawczego AppContainer. Dzięki izolowaniu aplikacji z niepotrzebnych zasobów i innych aplikacji można zminimalizować możliwości złośliwego manipulowania. Udzielanie dostępu na podstawie najniższych uprawnień uniemożliwia aplikacjom i użytkownikom uzyskiwanie dostępu do zasobów poza ich prawami. Kontrolowanie dostępu do zasobów chroni proces, urządzenie i sieć.
implementowanie AppContainer Aplikacja AppContainer jest implementowana przez dodanie nowych informacji do tokenu procesu, zmiana SeAccessCheck(), tak aby wszystkie starsze, niezmodyfikowane obiekty listy kontroli dostępu (ACL) blokowały żądania dostępu z procesów AppContainer domyślnie i ponownie obiektów listy ACL, które powinny być dostępne dla aplikacji AppContainers.