Повышение от низкой до средней целостности - PullRequest
4 голосов
/ 30 ноября 2011

Это похоже на " как создать процесс со средним уровнем целостности из процесса с низким уровнем целостности? ", но я подхожу немного под другим углом.(И это все равно не получено ответа.):)

Если файл сохраняется с низким уровнем целостности (как правило, из приложения с низким уровнем целостности, такого как браузер), то он помечается обязательной меткой низкого уровня целостности.(Эта метка также может применяться с icacls /setintegritylevel low.) Если такой файл выполняется, он становится процессом с низкой целостностью, понятно.

Есть ли какой-нибудь способ повысить (через пользовательский интерфейс согласия) этот процесс обратно ксредняя целостность?Можно достичь высокой целостности, если приложение помечено манифестом requiresAdministrator или если оно вызывает ShellExecute с глаголом runas, но, очевидно, для этого также требуются права администратора.Переход к средней целостности не требует прав администратора и все еще разблокирует множество разрешений, недоступных процессам с низкой целостностью.

Очевидно, что любой механизм для этого должен требовать пользовательского интерфейса согласия пользователя (это должно быть невозможно сделать)молча, иначе какой в ​​этом смысл?), но как это можно вызвать?

Единственное обсуждение по этой теме, которое я обнаружил, заключается в том, чтобы иметь свой собственный процесс изначально-средней целостности и раскручивать низкий уровень.- целостность процесса от него;это позволяет повысить уровень за счет обратной связи с процессом средней целостности и заставить его запускать что угодно.Но это не помогает, когда сама ОС изначально запускает процесс с низкой целостностью.

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Вам придется делать то, что делает 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;

И я перестаю транскодировать все остальное с паскаля на C #. Это все равно не может быть сделано, это ответ.

1 голос
/ 01 декабря 2011

Я никогда не видел и не слышал о способе получения согласия пользователя на повышение целостности процесса. Я бы сказал, что вам не повезло.

См. Также эту статью блога для справки: Internet Explorer в защищенном режиме - как создается среда с низкой целостностью

...