从低到中提升完整性

时间:2011-11-30 19:46:09

标签: windows windows-vista uac integrity

这类似于" how create medium integrity level process from low integrity level process?",但我的角度略有不同。 (无论如何,这还没有回答。):)

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

有没有办法提升(通过同意用户界面)这个过程回到中等完整性?如果应用标记有requiresAdministrator清单,或者如果它使用ShellExecute动词调用runas,则可以实现高完整性,但显然这需要管理员权限好。中等完整性并不需要管理员权限,它仍然可以解锁大量低完整性流程无法使用的权限。

显然,任何这样做的机制都应该要求用户同意用户界面(不应该默默地进行,否则,重点是什么?),但是如何调用呢?

我发现的关于这一主题的唯一讨论涉及拥有自己的原始中等完整性流程,并从中剥离低完整性流程;这允许通过通信回升到中等完整性过程并使其启动任何事情。但是,当操作系统本身最初以低完整性启动流程时,这并没有帮助。

2 个答案:

答案 0 :(得分:1)

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

另请参阅此博客文章以供参考:Internet Explorer in Protected Mode – How the Low Integrity Environment Gets Created

答案 1 :(得分:1)

您必须执行Internet Explorer(和Chrome)所做的事情。浏览器选项卡本身是以低强制完整性级别运行的单独进程。但仍有中等级别的父进程。

客户端进程通过命名管道与“父”进程通信,要求父进程执行某些操作。由于父母是中等的,它可以在中等水平上发射。


更新:以下是如何从低完整性流程创建中等完整性流程的示例:

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#。无论如何都无法做到,这就是答案。