Создание процесса в песочнице

Создает новый процесс в составной песочнице.

В этой статье описаны как Experimental_CreateProcessInSandbox, так и Experimental_CreateProcessAsUserInSandbox. Эти API запускают процесс со свойствами хранения, описанными в скомпилированной спецификации песочницы. Они являются изолированными эквивалентами CreateProcess и CreateProcessAsUser соответственно.

Important

Эти API являются экспериментальными и подвержены изменению.

Syntax

BOOL Experimental_CreateProcessInSandbox(
    _In_opt_  LPCWSTR                applicationName,
    _Inout_opt_ LPWSTR               commandLine,
    _In_opt_  LPSECURITY_ATTRIBUTES  processAttributes,      // Reserved
    _In_opt_  LPSECURITY_ATTRIBUTES  threadAttributes,       // Reserved
    BOOL                             inheritHandles,          // Reserved
    DWORD                            creationFlags,
    _In_opt_  LPVOID                 environment,
    _In_opt_  LPCWSTR                currentDirectory,
    _In_      LPSTARTUPINFOW         startupInfo,
    _In_      LPCWSTR                identity,
    _In_reads_bytes_(sandboxSpecificationSize) LPCVOID sandboxSpecification,
    DWORD                            sandboxSpecificationSize,
    _Out_     LPPROCESS_INFORMATION  processInformation
);
BOOL Experimental_CreateProcessAsUserInSandbox(
    _In_      HANDLE                 token,
    _In_opt_  LPCWSTR                applicationName,
    _Inout_opt_ LPWSTR               commandLine,
    _In_opt_  LPSECURITY_ATTRIBUTES  processAttributes,      // Reserved
    _In_opt_  LPSECURITY_ATTRIBUTES  threadAttributes,       // Reserved
    BOOL                             inheritHandles,          // Reserved
    DWORD                            creationFlags,
    _In_opt_  LPVOID                 environment,
    _In_opt_  LPCWSTR                currentDirectory,
    _In_      LPSTARTUPINFOW         startupInfo,
    _In_      LPCWSTR                identity,
    _In_reads_bytes_(sandboxSpecificationSize) LPCVOID sandboxSpecification,
    DWORD                            sandboxSpecificationSize,
    _Out_     LPPROCESS_INFORMATION  processInformation
);

Parameters

token (Только вариант AsUser)

Дескриптор первичного маркера, представляющего пользователя под удостоверением изолированного процесса. Дескриптор должен иметь TOKEN_QUERYи TOKEN_DUPLICATETOKEN_ASSIGN_PRIMARY доступ.

То же, что и CreateProcessAsUser.

Если этот параметр имеет значение NULL, функция завершается ошибкой E_HANDLE.


applicationName

То же, что и CreateProcess. Если значение NULL, исполняемый файл разрешается из commandLine.


commandLine

То же, что и CreateProcess.


processAttributes

Не поддерживается. Должно иметь значение NULL. Если значение не равно NULL, функция завершается ошибкой ERROR_NOT_SUPPORTED. Этот параметр зарезервирован для использования в будущем.


threadAttributes

Не поддерживается. Должно иметь значение NULL. Если значение не равно NULL, функция завершается ошибкой ERROR_NOT_SUPPORTED. Этот параметр зарезервирован для использования в будущем.


inheritHandles

Не поддерживается. Должен иметь значение FALSE. Если значение TRUE, функция завершается ERROR_NOT_SUPPORTEDошибкой. Этот параметр зарезервирован для использования в будущем.


creationFlags

То же, что и CreateProcess.

Важно: Если вы предоставляете environment блок, необходимо включить CREATE_UNICODE_ENVIRONMENT его creationFlags. Принимаются только блоки среды Юникода (см. ниже).


environment

То же, что и CreateProcess.

Дополнительные ограничения:

Ограничение Error
Должен быть блоком среды Юникода (широкий символ). Блоки среды ANSI не поддерживаются. E_INVALIDARG
Необходимо выровнять WCHAR (размер должен быть кратным sizeof(WCHAR)). E_INVALIDARG
Должен быть завершен двойным значением NULL (L"\0\0" в конце). E_INVALIDARG
Максимальный размер: 32 МБ. E_INVALIDARG

Если значение NULL, дочерний процесс наследует среду вызывающего процесса (стандартное CreateProcess поведение).


currentDirectory

То же, что и CreateProcess. Если значение NULL, по умолчанию используется текущий каталог вызывающего объекта.


startupInfo

То же, что и CreateProcess.

Не должно быть NULL. Если значение NULL, функция завершается E_INVALIDARGошибкой.


identity

Строка Юникода, завершающаяся значением NULL, однозначно идентифицирующая этот экземпляр песочницы. Удостоверение служит именем профиля AppContainer (если включена изоляция AppContainer) и определяет идентификатор идентификатора процесса для маркера.

Требования:

  • Не должно быть NULL. Если значение NULL, функция завершается E_INVALIDARGошибкой.
  • Необходимо однозначно определить песочницу. Две песочницы с одинаковым удостоверением совместно используют профиль AppContainer (и, следовательно, совместно используют разрешения файловой системы или сети, производные от этого профиля).
  • Не должен сталкиваться с установленным именем семейства пакетов MSIX. Модуль отклоняет удостоверения, имя семейства пакетов которых соответствует установленному пакету MSIX (ошибка: E_ACCESSDENIED). Это защищает от процессов песочницы, наследующих разрешения, предназначенные для установленного приложения.
    • Обход разработчика: Эта проверка пропускается, если в системе включен режим разработчика, отключена безопасная загрузка и включена проверка подписи.

Примеры:

"MyAgent_Sandbox_001"
"Contoso.ChatBot_abc123"

sandboxSpecification

Указатель на скомпилированный буфер спецификации песочницы (формат FlatBuffer, идентификатор "SBOX"файла).

Не должно быть NULL. Если значение NULL (или sandboxSpecificationSize равно 0), функция завершается ошибкой E_INVALIDARG.

Спецификация описывает свойства хранения для применения к запущенной процедуре. Ниже приведены поля спецификации песочницы .


sandboxSpecificationSize

Размер буфера в байтах sandboxSpecification .


processInformation

То же, что и CreateProcess.

Не должно быть NULL. Если значение NULL, функция завершается E_INVALIDARGошибкой.


Возвращаемое значение

Если функция выполнена успешно, возвращаемое значение ненулевое (TRUE).

Если функция завершается ошибкой, возвращаемое значение равно нулю (FALSE). Вызов GetLastError для получения расширенного кода ошибки.


Поля спецификации песочницы

Спецификация песочницы — это структура в кодировке FlatBuffer (схема: ), SandboxSpec.fbsописывающая политики хранения. Поддерживаются следующие поля:

version (строка, обязательный)

Версия схемы. Должен быть "0.1.0" для текущего выпуска. Подсистема отклоняет любую другую версию с ERROR_NOT_SUPPORTED.


app_container (bool, default: false)

Включает изоляцию AppContainer для изолированного процесса. Если значение true, подсистема создает (или открывает) профиль AppContainer с помощью identity параметра в качестве имени профиля и запускает процесс в этом AppContainer.

AppContainer предоставляет:

  • Изоляция процессов на уровне ядра (доступ к большинству системных ресурсов по умолчанию запрещен)
  • Сетевая изоляция (доступ к сети не предоставляется только с помощью возможностей)
  • Изоляция файловой системы (нет доступа за пределами явно предоставленных путей)

Важно: Многие поля ограничения песочницы, включая fs_read_write, fs_read_onlynetwork_policyи capabilities -- не вступают в силу, если app_container этоfalse. Эти функции зависят от изоляции AppContainer в качестве базового механизма принудительного применения. Установка путей файловой системы или возможностей без AppContainer приведет к E_INVALIDARG.


integrity (enum IntegrityLevel, по умолчанию: system_default)

Управляет уровнем целостности изолированного маркера процесса.

Ценность Behavior
system_default Система выбирает безопасное значение по умолчанию. Для процессов AppContainer это низкая целостность; для процессов, отличных от AppContainer, применяется стандартное CreateProcess наследование.
inherit Дочерний процесс наследует уровень целостности вызывающего объекта (классическое CreateProcess поведение).
untrusted Задает для процесса уровень целостности ненадежных данных.
low Задает для процесса низкий уровень целостности (SECURITY_MANDATORY_LOW_RID).
medium Задает для процесса уровень целостности среднего уровня (SECURITY_MANDATORY_MEDIUM_RID).
high Задает для процесса высокий уровень целостности (SECURITY_MANDATORY_HIGH_RID).

Примечание: Если app_container включен уровень целостности всегда низкий (system_default поведение). Явное задание другого уровня целостности в сочетании с app_container = true не поддерживается.

Ограничение безопасности: Подсистема отказывается задать уровень целостности выше , чем уровень целостности маркера вызывающего объекта (ошибка: E_ACCESSDENIED). Вы не можете повысить привилегии через это поле.


disallow_win32k_system_calls (bool, default: false)

Если задано значение true, применяется политика отключения системного вызова Win32k . Изолированный процесс полностью запрещает доступ к подсистеме ГРАФИЧЕСКОго интерфейса (win32k.sys). Это подходит для головных и фоновых рабочих нагрузок.


ui_restrictions (uint64, по умолчанию: 0)

Битовая маска флагов JOB_OBJECT_UILIMIT_*, ограничивающих взаимодействие изолированного процесса с рабочим столом Windows. Процесс помещается в объект задания с применением этих ограничений пользовательского интерфейса.

Влияние иерархии заданий: Изолированный процесс назначается новому объекту задания, созданному системой. Если вызывающий процесс (или его дерево процессов) уже связан с объектом задания, помните, что применяются правила вложения объекта задания Windows. Новое задание становится дочерним в иерархии заданий. Ограничения, установленные для родительского задания, по-прежнему применяются ко всем процессам в дочерних заданиях. Вызывающие пользователи, использующие собственную иерархию заданий, должны учитывать дополнительные задания, созданные здесь.

Значение означает отсутствие ограничений пользовательского 0 интерфейса. К общим флагам относятся:

Flag Ценность Описание
JOB_OBJECT_UILIMIT_DESKTOP 0x0040 Запрещает создание или переключение рабочих столов.
JOB_OBJECT_UILIMIT_DISPLAYSETTINGS 0x0010 Запрещает изменение параметров отображения.
JOB_OBJECT_UILIMIT_EXITWINDOWS 0x0080 Запрещает вызовы ExitWindowsEx.
JOB_OBJECT_UILIMIT_GLOBALATOMS 0x0020 Ограничивает доступ к глобальному атому.
JOB_OBJECT_UILIMIT_HANDLES 0x0001 Ограничивает доступ к дескрипторам USER за пределами задания.
JOB_OBJECT_UILIMIT_READCLIPBOARD 0x0002 Запрещает чтение буфера обмена.
JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS 0x0008 Предотвращает изменение параметров системы.
JOB_OBJECT_UILIMIT_WRITECLIPBOARD 0x0004 Запрещает запись в буфер обмена.

capabilities (строка, по умолчанию: пустая)

Список именованных возможностей с разделителями-запятыми для предоставления изолированному процессу (например, "internetClient,registryRead").

Требует использования app_container = true. Если возможности указаны без включения AppContainer, функция завершается ошибкой E_INVALIDARG.

Возможности разрешаются с помощью DeriveCapabilitySidsFromName. Если любая запрошенная возможность не может быть разрешена, вся операция завершается сбоем . Подсистема не ухудшает песочницу (это даст более слабую песочницу, чем вызывающий объект).

Общие возможности:

Capability Описание
internetClient Исходящий сетевой доступ к Интернету.
internetClientServer Входящий и исходящий доступ к интернет-сети.
privateNetworkClientServer Доступ к домашней или рабочей сети.
registryRead Доступ на чтение к кустам реестра HKLM.

fs_read_write (массив строк, значение по умолчанию: пустое)

Массив путей к каталогу, к которым изолированный процесс предоставляется доступ для чтения и записи с помощью политик привязанной файловой системы (BFS).

Требует использования app_container = true. Если пути файловой системы указаны без AppContainer, функция завершается ошибкой E_INVALIDARG.

Пути должны быть полными (например, "C:\\Users\\Alice\\Documents\\Workspace"). Доступ применяется рекурсивно ко всем файлам и подкаталогам по указанному пути.

Исключение: Если для пути чтения и записи задан корневой каталог диска (например, "C:\\"), предоставление доступа не применяется рекурсивно. Только корневой каталог доступен, а не весь том.


fs_read_only (массив строк, значение по умолчанию: пустое)

Массив путей каталога, к которым изолированный процесс предоставляется доступ только для чтения с помощью политик привязанной файловой системы (BFS).

Требует использования app_container = true. Если пути файловой системы указаны без AppContainer, функция завершается ошибкой E_INVALIDARG.

Пути должны быть полностью квалифицированы. Доступ применяется рекурсивно ко всем файлам и подкаталогам по указанному пути.


network_policy (table NetworkPolicy, default: empty)

Конфигурация политики сети для изолированного процесса.

Требует использования app_container = true. Сетевая политика зависит от сетевой изоляции AppContainer.

network_policy.proxy (таблица proxy_info)

proxy.url (строка)

URL-адрес, указывающий прокси-сервер, через который направляется сетевой трафик изолированного процесса. При установке подсистема настраивает параметры прокси-сервера AppContainer таким образом, чтобы весь исходящий трафик проходил через указанный прокси-сервер.


Дополнительные ограничения

Ограничение олицетворения

SandboxEngine применяет маркер процесса вызывающего объекта и маркер потока (контекст олицетворения) к тому же удостоверению. Если вызывающий объект олицетворяет другого пользователя во время вызова, функция завершается ошибкой ERROR_NOT_SAME_OBJECT.

Это предотвращает создание песочницы под удостоверением неправильного пользователя при олицетворении от имени нескольких клиентов.

Заблокированные вызывающие серверы AppContainer

Процесс, который выполняется внутри AppContainer , не может вызывать эти API. Модуль отклоняет такие вызовы.E_ACCESSDENIED Модель угроз для вложенной композиции песочницы (AppContainer создание дочерней песочницы) еще не завершена.


Remarks

  • API экспортируются из processmodel.dll. Вызывающие серверы должны динамически загружать библиотеку:

    HMODULE hMod = LoadLibraryExW(L"processmodel.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
    auto pfn = (PFN_Experimental_CreateProcessInSandbox)GetProcAddress(hMod, "Experimental_CreateProcessInSandbox");
    
  • Буфер спецификации песочницы — это двоичный blob-объект FlatBuffer (идентификатор "SBOX"файла), соответствующий схеме SandboxSpec.fbs .

  • Вариант Experimental_CreateProcessAsUserInSandbox позволяет указать другой маркер пользователя (аналогично CreateProcessAsUser). Параметр identity по-прежнему должен быть предоставлен.


Коды ошибок

Состояние Error
processAttributes имеет значение, отличное от NULL ERROR_NOT_SUPPORTED
threadAttributes имеет значение, отличное от NULL ERROR_NOT_SUPPORTED
inheritHandles имеет значение TRUE ERROR_NOT_SUPPORTED
token значение NULL (вариант AsUser) E_HANDLE
startupInfo имеет значение NULL E_INVALIDARG
sandboxSpecification значение NULL или размер равно 0 E_INVALIDARG
processInformation имеет значение NULL E_INVALIDARG
identity имеет значение NULL E_INVALIDARG
Блок среды не соответствует WCHAR E_INVALIDARG
Блок среды, отсутствующий терминатор с двойным значением NULL E_INVALIDARG
Блок среды превышает 32 МБ E_INVALIDARG
Спецификация version не является "0.1.0" ERROR_NOT_SUPPORTED
Сбой проверки FlatBuffer ERROR_INVALID_DATA
Возможности, указанные без app_container E_INVALIDARG
Пути файловой системы, указанные без app_container E_INVALIDARG
Прокси-сервер, указанный без app_container E_INVALIDARG
Удостоверения сталкиваются с установленным пакетом MSIX E_ACCESSDENIED
Несоответствие олицетворения (маркер процесса != токен потока) ERROR_NOT_SAME_OBJECT
Вызывающий объект — это процесс AppContainer E_ACCESSDENIED
Запрошенный уровень целостности вызывающего абонента уровня целостности > E_ACCESSDENIED
Имя неразрешимой возможности ERROR_NOT_FOUND

Требования

Requirement Ценность
DLL processmodel.dll
Минимальный поддерживаемый клиент Windows 11 (экспериментальный)
Header Недоступно (используйте GetProcAddress)

См. также