Поделиться через


AppContainer для устаревших приложений

Среда AppContainer — это ограничивающая среда выполнения процесса, которая может использоваться для устаревших приложений для обеспечения безопасности ресурсов. Процесс приложения AppContainer и его дочерние процессы выполняются в упрощенном контейнере приложений, где они могут получить доступ только к ресурсам, которые специально предоставляются им. И они изолированы с помощью файловой системы и виртуализации реестра. В результате приложения, реализованные в AppContainer, не могут быть взломаны, чтобы разрешить вредоносные действия за пределами ограниченных назначенных ресурсов.

Для упакованных и распакованных приложений AppContainer представляет хорошую, безопасную инженерную практику.

Совет

AppContainer изначально был назван LowBox (до выпуска Windows 8). Это устаревшее имя можно увидеть в именах API, таких как NtCreateLowBoxToken.

Упакованные приложения

Вы можете взять приложение, упаковаемое с помощью MSIX, и легко настроить его для запуска в среде AppContainer. приложения универсальная платформа Windows (UWP) автоматически являются приложениями AppContainer. Но вы также можете настроить классическое приложение, упаковаемое с помощью MSIX, для приложения AppContainer. Это особенно легко использовать AppContainer, если вы упаковывать с помощью MSIX. Дополнительные сведения, сценарии и примеры конфигурации см . в приложениях MSIX AppContainer.

Неупакованные приложения

Распаковка приложения также может выполняться в контейнере приложений. Чтобы создать процесс в контейнере приложений, требуется определение AppContainer (или профиль). Поэтому использование AppContainer с упакованным приложением проще. При регистрации пакета для пользователя стек развертывания вызывает определенные API Win32, чтобы создать необходимый профиль AppContainer (например, CreateAppContainerProfile). При отмене регистрации пакета для пользователя стек развертывания выполняет работу по удалению профиля AppContainer (DeleteAppContainerProfile). Если вы не упаковываете приложение, то вам нужно сделать то же самое, вызвав эти API Win32 самостоятельно; но это может быть сложно.

Большинство непакованных приложений, которые использовали низкий уровень целого уровня, теперь используют AppContainer в качестве лучшего способа предоставления ограниченной среды выполнения.

Когда распакованный процесс, выполняемый в контейнере приложения, вызывает CreateProcess, дочерний процесс обычно наследует маркер родительского объекта. Этот маркер включает сведения о уровне целостности (IL) и контейнере приложений. Лучше всего не думать о одной оси со значениями с повышенными или средними/низкими/appContainer на нем. Вместо этого, будучи или не находясь в контейнере приложения, является вторым и ортогональным свойством. Таким образом, если вы находитесь в контейнере приложений, уровень целостности (IL) всегда низкий.

Преимущества использования среды AppContainer

Ключевой целью среды AppContainer является разделение состояния приложения от состояния системы как можно больше, при сохранении совместимости с другими приложениями. Windows достигает этого, обнаруживая и перенаправляя определенные изменения, внесенные в файловую систему и реестр во время выполнения (например , виртуализация). Приложение AppContainer записывает данные в свой собственный виртуальный реестр и папку данных приложения, а данные удаляются при удалении или сбросе приложения. Другие приложения не имеют доступа к виртуальному реестру или виртуальной файловой системе приложения AppContainer.

Поэтому среда AppContainer обеспечивает безопасную песочницу приложений. Изоляция приложения от доступа к оборудованию, файлам, реестру, другим приложениям, сетевым подключениям и сетевым ресурсам без определенного разрешения. Отдельные ресурсы можно использовать без предоставления других ресурсов. Кроме того, удостоверение пользователя защищено с помощью уникального удостоверения, которое является объединением пользователя и приложения; и ресурсы предоставляются с помощью модели с наименьшими привилегиями. Это еще больше защищает приложение от олицетворения пользователя для получения доступа к другим ресурсам.

Пример кода для тестирования для запуска в контейнере приложения

В проекте C# или C++ можно использовать соответствующий пример кода ниже, чтобы определить, выполняется ли процесс внутри контейнера приложения. Для каждого примера после выполнения кода, если значение isAppContainer не равно нулю (или true), процесс выполняется внутри контейнера приложения.

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)

В этом примере используются библиотеки реализации Windows (WIL)). Удобный способ установки WIL — перейти в Visual Studio, щелкните "Управление пакетами NuGet"...>>Просмотрите, введите или вставьте Microsoft.Windows.ImplementationLibrary в поле поиска, выберите элемент в результатах поиска и нажмите кнопку "Установить", чтобы установить пакет для этого проекта.

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

Функции wil::get_token_is_app_container_nothrow и wil::get_token_is_app_container_failfast предлагают альтернативные стратегии обработки ошибок. Дополнительные сведения см. в разделе wil\token_helpers.h .

C++ (канонический)

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

В этом разделе

Дополнительные сведения об использовании AppContainer для устаревших приложений см. в следующих разделах.

Статья Описание
Изоляция AppContainer Изоляция — это основная цель среды выполнения AppContainer. Изоляция приложения от ненужных ресурсов и других приложений позволяет свести к минимуму возможности для вредоносных манипуляций. Предоставление доступа на основе минимальных привилегий запрещает приложениям и пользователям получать доступ к ресурсам за пределами своих прав. Управление доступом к ресурсам защищает процесс, устройство и сеть.
Реализация AppContainer AppContainer реализуется путем добавления новых сведений в маркер процесса, изменения SeAccessCheck(), чтобы все устаревшие, неизмененные объекты списка управления доступом (ACL) блокировали запросы доступа из процессов AppContainer по умолчанию, а также объекты ACL, которые должны быть доступны для AppContainers.