4

这类似于“如何从低完整性级别流程创建中等完整性级别流程? ”,但我的角度略有不同。(无论如何都没有回答。):)

如果文件保存为低完整性(通常来自浏览器等低完整性应用程序),则将其标记为低完整性强制标签。(这个标签也可以与 . 一起应用icacls /setintegritylevel low。)如果执行这样的文件,它会变成一个低完整性的过程,这是可以理解的。

是否有某种方法可以(通过同意 UI)将此过程提升到中等完整性?如果应用程序标有requiresAdministrator清单,或者ShellExecute使用runas动词调用,则可以达到高完整性,但显然这也需要管理员权限。达到中等完整性不需要管理员权限,它仍然会解锁许多低完整性进程无法使用的权限。

显然,任何这样做的机制都应该要求用户同意 UI(应该不可能默默地做到这一点,否则有什么意义呢?),但是如何调用呢?

我发现关于这个主题的唯一讨论涉及拥有自己的原始中等完整性流程并从中分离出低完整性流程;这允许通过通信提升到中等完整性进程并让它启动任何东西。但是,当操作系统本身最初以低完整性启动进程时,这无济于事。

4

2 回答 2

1

我从未见过或听说过获得用户同意将流程从低完整性提升到中等完整性的方法。我会说你运气不好。

另请参阅此博客文章以供参考:保护模式下的 Internet Explorer – 如何创建低完整性环境

于 2011-11-30T20:09:37.043 回答
1

您将不得不做 Internet Explorer(和 Chrome)所做的事情。浏览器选项卡本身是在Low Mandatory Integrity Level运行的独立进程。但是仍然有一个中等级别的父进程。

客户端进程通过命名管道与“父”进程通信,要求父进程执行一些操作。由于父母是中型的,它可以在中型上启动一些东西。


更新:这是一个示例,说明如何无法从低完整性进程创建中等完整性进程:

void CreateLowProcess(String szProcessName; String IntegritySid)
{
    hToken: THandle;
    hNewToken: THandle;
    szIntegritySid: WideString;
    pIntegritySid: PSID;
    TIL: TOKEN_MANDATORY_LABEL;
    ProcInfo: PROCESS_INFORMATION;
    startupInfo: TStartupInfo;

    const int SE_GROUP_INTEGRITY = 0x00000020;
    const int TokenIntegrityLevel = 25;

    const String SLowIntegritySid = "S-1-16-4096";
    const String SMediumIntegritySid = "S-1-16-8192";
    const String SHighIntegritySid = "S-1-16-12288";
    const String SSystemIntegritySid = "S-1-16-16384";

    /*
        Designing Applications to Run at a Low Integrity Level
        http://msdn.microsoft.com/en-us/library/bb625960.aspx
    */

    // Low integrity SID
    if IntegritySid == ""
       IntegritySid = SMediumIntegritySid;

    pIntegritySid = null;

    ZeroMemory(@startupInfo, sizeof(startupInfo));


    if (!OpenProcessToken(GetCurrentProcess(), 
          TOKEN_DUPLICATE or TOKEN_ADJUST_DEFAULT or TOKEN_QUERY or TOKEN_ASSIGN_PRIMARY, 
          ref hToken))
    RaiseLastWin32Error;
    try
        if (not DuplicateTokenEx(hToken, 0, nil, SecurityImpersonation, TokenPrimary, {var}hNewToken)) then
            RaiseLastWin32Error;
        try
            if (not ConvertStringSidToSidW(PWideChar(szIntegritySid), {var}pIntegritySid)) then
                RaiseLastWin32Error;
            try
                TIL._Label.Attributes := SE_GROUP_INTEGRITY;
                TIL._Label.Sid := pIntegritySid;

                // Set the process integrity level
                if (not SetTokenInformation(hNewToken, TTokenInformationClass(TokenIntegrityLevel), @TIL,
                        sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid))) then
                    RaiseLastWin32Error;

                //Create the new process at Low integrity
                Result := CreateProcessAsUserW(
                        hNewToken,
                        nil,
                        PWideChar(szProcessName),
                        nil, //ProcessAttributes
                        nil, //ThreadAttributes
                        False, //bInheritHandles
                        0, //dwCreationFlags
                        nil, //lpEnvironment
                        nil, //lpCurrentDirectory
                        startupInfo,
                        ProcInfo);
            finally
                LocalFree(Cardinal(pIntegritySid));
            end;
        finally
            CloseHandle(hNewToken);
        end;
    finally
        CloseHandle(hToken);
    end;
end;

我放弃将其余部分从 pascal 转码为 C#。无论如何都做不到,这就是答案。

于 2012-03-05T03:46:50.537 回答