在沙盒中创建进程

在可组合沙盒中创建新进程。

本文介绍 Experimental_CreateProcessInSandboxExperimental_CreateProcessAsUserInSandbox。 这些 API 使用编译的沙盒规范描述的包含属性启动进程。 它们是 CreateProcess 和 CreateProcessAsUser 的沙盒等效项。

重要

这些 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_QUERYTOKEN_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。 仅接受 Unicode 环境块(请参阅下面的 环境 )。


environment

CreateProcess 相同。

其他约束:

约束 Error
必须是 Unicode (宽字符)环境块。 不支持 ANSI 环境块。 E_INVALIDARG
必须是 WCHAR 对齐(大小必须为倍数 sizeof(WCHAR))。 E_INVALIDARG
必须以双 null 结尾(L"\0\0" 结尾)。 E_INVALIDARG
最大大小:32 MB。 E_INVALIDARG

如果为 NULL,则子进程继承调用进程的环境(标准 CreateProcess 行为)。


currentDirectory

CreateProcess 相同。 如果为 NULL,则默认为调用方当前目录。


startupInfo

CreateProcess 相同。

不得为 NULL。 如果为 NULL,则函数失败并出现 E_INVALIDARG


identity

唯一标识此沙盒实例的以 null 结尾的 Unicode 字符串。 标识充当 AppContainer 配置文件名称(启用 AppContainer 隔离时),并确定令牌上的进程标识 SID。

要求

  • 不得为 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,默认值: false

为沙盒进程启用 AppContainer 隔离。 如果为 true,则引擎使用 identity 参数作为配置文件名称创建 AppContainer 配置文件(或打开),并在该 AppContainer 中启动进程。

AppContainer 提供:

  • 内核级进程隔离(对大多数系统资源的默认拒绝访问)
  • 网络隔离(除非通过功能授予)没有网络访问权限)
  • 文件系统隔离(在显式授予的路径之外没有访问权限)

重要:许多沙盒限制字段 (包括fs_read_writefs_read_onlynetwork_policy)如果为false,则capabilities -- 不生效app_container。 这些功能依赖于 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,默认值: false

如果为 true,则应用 Win32k 系统呼叫禁用 缓解策略。 沙盒进程完全被拒绝访问 GUI 子系统(win32k.sys)。 这适用于无外设/后台工作负荷。


ui_restrictions(uint64,默认值: 0

JOB_OBJECT_UILIMIT_* 标志的位掩码,用于限制沙盒进程的与 Windows 桌面的交互。 此过程放置在应用了这些 UI 限制的作业对象中。

作业层次结构影响: 沙盒进程分配给系统创建的新作业对象。 如果调用进程(或其进程树)已与作业对象关联,请注意Windows作业对象嵌套规则适用。 新作业将成为作业层次结构中的子级。 对父作业设置的限制仍适用于子作业中的所有进程。 依赖自身作业层次结构的调用方应考虑此处创建的其他作业。

表示没有 UI 限制的值 0 。 常见标志包括:

Flag Description
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 Description
internetClient 对 Internet 的出站网络访问。
internetClientServer 入站和出站 Internet 网络访问。
privateNetworkClientServer 家庭/工作网络访问。
registryRead 对 HKLM 注册表配置单元的读取访问权限。

fs_read_write (字符串数组,默认值:空)

通过绑定文件系统 (BFS) 策略授予沙盒进程 读取/写入 访问权限的目录路径数组。

需要 app_container = true 如果在未指定 AppContainer 的情况下指定文件系统路径,则函数将失败并出现 E_INVALIDARG

路径应完全限定(例如 "C:\\Users\\Alice\\Documents\\Workspace")。 Access 以 递归方式 应用于指定路径下的所有文件和子目录。

例外: 当读/写路径设置为驱动器根目录(例如), "C:\\"访问授予 不会 以递归方式应用。 只有根目录本身是可访问的,而不是整个卷。


fs_read_only (字符串数组,默认值:空)

通过绑定文件系统 (BFS) 策略授予沙盒进程的 只读 访问权限的目录路径数组。

需要 app_container = true 如果在未指定 AppContainer 的情况下指定文件系统路径,则函数将失败并出现 E_INVALIDARG

路径应完全限定。 Access 以 递归方式 应用于指定路径下的所有文件和子目录。


network_policy (表 NetworkPolicy,默认值:空)

沙盒进程的网络策略配置。

需要 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");
    
  • 沙盒规范缓冲区是符合SandboxSpec.fbs架构的 FlatBuffer 二进制 Blob(文件标识符"SBOX")。

  • Experimental_CreateProcessAsUserInSandbox 变体允许指定不同的用户令牌(类似于 CreateProcessAsUser)。 identity仍必须提供该参数。


错误代码

Condition Error
processAttributes 为非 NULL ERROR_NOT_SUPPORTED
threadAttributes 为非 NULL ERROR_NOT_SUPPORTED
inheritHandles 为 TRUE ERROR_NOT_SUPPORTED
token 为 NULL (AsUser variant) 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 MB 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

另请参阅