在可组合沙盒中创建新进程。
本文介绍 Experimental_CreateProcessInSandbox 和 Experimental_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_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。 仅接受 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_write,fs_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) |