Можно ли понизить, а затем вернуть старый Integrity Level?
От: morden Украина http://www.morden.com.ua/
Дата: 29.08.12 15:42
Оценка:
Доброй день

Можно ли понизить, а затем вернуть старый Integrity Level из управляющего процесса?

Следующий код возвращает ошибку 1314 == ERROR_PRIVILEGE_NOT_HELD (A required privilege is not held by the client), однако я выполняю эту операцию возврата Integrity Level из процесса с большим Integrity Level.

1) Запоминаем старый Integrity Level
2) устанавливаем более низкий Integrity Level ("S-1-16-0" == SECURITY_MANDATORY_UNTRUSTED_RID) для процесса
3) устанавливаем старый Integrity Level
4) Результат ошибка 1314


LPWSTR GetTokenIntegritySid(HANDLE hToken)
{
    BOOL    bb;
    DWORD   dw;
    LPWSTR  str;

    TOKEN_MANDATORY_LABEL *pTIL;

    bb = GetTokenInformation ( hToken, TokenIntegrityLevel, NULL, 0, &dw);
    pTIL = (TOKEN_MANDATORY_LABEL *)malloc(dw);
    bb = GetTokenInformation ( hToken, TokenIntegrityLevel, pTIL, dw, &dw);

    ConvertSidToStringSid(pTIL->Label.Sid, &str);

    return str;
}

DWORD SetTokenIntegritySid(HANDLE hToken, LPCWSTR szSid)
{
    BOOL    bb;
    DWORD   dw;

    TOKEN_MANDATORY_LABEL TIL;
    PSID pIntegritySid = NULL;

    if (!ConvertStringSidToSid(szSid, &pIntegritySid))
        return GetLastError();

    TIL.Label.Attributes = SE_GROUP_INTEGRITY;
    TIL.Label.Sid = pIntegritySid;

    dw = sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid);

    bb = SetTokenInformation ( hToken, TokenIntegrityLevel, &TIL, dw);
    if (!bb)
        return GetLastError();

    return NO_ERROR;
}

void Test()
{
    HANDLE hToken;

    // Notepad is used as an example
    WCHAR wszProcessName[MAX_PATH] =
        L"C:\\Windows\\System32\\Notepad.exe";

    PROCESS_INFORMATION ProcInfo = {0};
    STARTUPINFO StartupInfo = {0};
    LPWSTR sSid = NULL;
    LPWSTR sSidBase = NULL;
    DWORD dw;

    if (OpenProcessToken(GetCurrentProcess(),MAXIMUM_ALLOWED, &hToken))
    {
        CreateProcessAsUser(hToken, NULL,
                            wszProcessName, NULL, NULL, FALSE,
                            0, NULL, NULL, &StartupInfo, &ProcInfo);

        OpenProcessToken(ProcInfo.hProcess, MAXIMUM_ALLOWED, &hToken);

        sSidBase = GetTokenIntegritySid(hToken);

        dw = SetTokenIntegritySid(hToken, L"S-1-16-0");   // низкий Integrity Level =  SECURITY_MANDATORY_UNTRUSTED_RID
        
        sSid = GetTokenIntegritySid(hToken);

        dw = SetTokenIntegritySid(hToken, sSidBase);  // старый Integrity Level
        
        dw;     // Errror == 1314

        sSid = GetTokenIntegritySid(hToken);
        
        CloseHandle(hToken);
    }
}



Спасибо
integrity level
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.