Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Создает новый процесс в составной песочнице.
В этой статье описаны как 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) |