如何 select 将 CreateRestrictedToken 中的基本令牌添加到沙盒系统级服务

How to select base token in CreateRestrictedToken to sandbox SYSTEM level services

我正在尝试在 C++ 中对 SYSTEM 级别的 Win 服务进行沙盒处理。为了创建沙盒进程,我们首先需要通过 CreateRestrictedToken 创建一个受限令牌,然后通过 CreateProcessAsUser 传递。

CreateRestrictedToken 需要输入现有流程的令牌。目前,我在删除 SID 和权限后使用当前 SYSTEM 级别进程的令牌。我阅读了以下内容https://www.tiraniddo.dev/2020/01/dont-use-system-tokens-for-sandboxing.html,发现不建议使用 SYSTEM 级别令牌作为基础令牌。

我从哪里获得基础令牌?

its not recommended to use SYSTEM level token as base token.

更确切地说,不建议将令牌与 AuthenticationId == SYSTEM_LUID 一起使用 (SYSTEM_LUIDwinnt.hntifs.h 中定义为 { 0x3e7, 0x0 } )

要获取另一个令牌(不是 0x3e7 = 999AuthenticationId,您只需调用

LogonUserW(L"*", L"*", L"*", LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, &hToken)

然后已经在返回的令牌上调用 CreateRestrictedToken