【问题标题】:Is there any way to "seal" a token so child processes can't inherit it?有没有办法“密封”一个令牌,这样子进程就不能继承它?
【发布时间】:2015-07-19 18:29:20
【问题描述】:

我正在尝试找到一种方法,允许以提升的用户身份启动单个进程,但禁止该进程使用其令牌启动任何子进程——在某种程度上,“密封”令牌。这样做的原因是为了防止用户启动 cmd.exe 并获得对系统的完全访问权限。

我查看了进程特权常量,但没有看到任何可用于实现此功能的东西。

【问题讨论】:

  • 好主意,但不幸的是,提升的应用程序可能是任何东西并且是未知的。我的思维模式倾向于类似的东西: - 创建一个服务,以提升用户身份启动进程。 - 获取对其令牌的引用并存储此引用。 - 注册一个 WMI 监听器来检查应用程序的启动——如果启动的应用程序与提升应用程序具有相同的令牌/权限,则自动终止子进程。
  • 我想你可以通过 ObRegisterCallbacks 使用内核模式驱动程序来做到这一点。但这将是一种非常肤浅的保护:任何可以使提升的进程启动 cmd.exe 的人几乎肯定可以使提升的进程执行 cmd.exe 可以做的任何事情,甚至更多。 (包括禁用您的保护机制并然后启动 cmd.exe!)

标签: windows winapi uac elevated-privileges


【解决方案1】:

我认为您不能密封令牌,但您可以使用作业对象控制子进程的创建:

static BOOL SpawnProcessAndTerminateGrandchildren(PTSTR Cmdline)
{
    HANDLE hJob = CreateJobObject(0, 0);
    if (!hJob) return false;

    JOBOBJECT_BASIC_LIMIT_INFORMATION jobli;
    jobli.LimitFlags = JOB_OBJECT_LIMIT_ACTIVE_PROCESS;
    jobli.ActiveProcessLimit = 1;
    BOOL retval = SetInformationJobObject(hJob, JobObjectBasicLimitInformation, &jobli, sizeof(jobli));

    PROCESS_INFORMATION pi;
    if (retval)
    {
        STARTUPINFO si;
        ZeroMemory(&si, sizeof(si)), si.cb = sizeof(si);
        retval = CreateProcess(0, Cmdline, 0, 0, false, CREATE_SUSPENDED|CREATE_BREAKAWAY_FROM_JOB|CREATE_NEW_CONSOLE, 0, 0, &si, &pi);
    }
    if (retval)
    {
        if (AssignProcessToJobObject(hJob, pi.hProcess)) // This can fail if we are already in a job
        {
            ResumeThread(pi.hThread);
            WaitForSingleObject(pi.hProcess, INFINITE);
        }
        else
            TerminateProcess(pi.hProcess, ERROR_OPERATION_ABORTED);
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }
    CloseHandle(hJob);
    return retval;
}


int main(int argc, ...)
{
    TCHAR cmd[] = TEXT("cmd.exe /k regedit"); // cmd.exe is our child, regedit is the grandchild spawned by cmd.exe
    SpawnProcessAndTerminateGrandchildren(cmd);
    return 0;
}

如果您想要更多控制权,您可以使用 JobObjectAssociateCompletionPortInformation,这样每次创建新的子进程时您都会收到 JOB_OBJECT_MSG_NEW_PROCESS 消息。

【讨论】:

    猜你喜欢
    • 2012-06-28
    • 2011-07-05
    • 2011-02-16
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2019-01-03
    • 1970-01-01
    相关资源
    最近更新 更多