Что означает обязательное значение уровня целостности 0x2010?

Я выполняю следующий фрагмент кода в своем процессе пользовательского режима, который запускается при входе учетной записи пользователя Windows в рабочую станцию. Или, другими словами, его путь находится в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run ключ реестра.

Код должен определять обязательный уровень целостности моего пользовательского процесса. Это так:

DWORD getMIL()
{
//Try to get integrity level
//-1                                            Unknown
//SECURITY_MANDATORY_UNTRUSTED_RID              0x00000000 Untrusted.
//SECURITY_MANDATORY_LOW_RID                    0x00001000 Low integrity.
//SECURITY_MANDATORY_MEDIUM_RID                 0x00002000 Medium integrity.
//SECURITY_MANDATORY_MEDIUM_PLUS_RID            SECURITY_MANDATORY_MEDIUM_RID + 0x100 Medium high integrity.
//SECURITY_MANDATORY_HIGH_RID                   0X00003000 High integrity.
//SECURITY_MANDATORY_SYSTEM_RID                 0x00004000 System integrity.
//SECURITY_MANDATORY_PROTECTED_PROCESS_RID      0x00005000 Protected process.
DWORD dwIntgtyLvl = -1;

HANDLE hToken;
if(OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken))
{

DWORD dwSizeIntgtyLvl = 0;
if(!GetTokenInformation(hToken, TokenIntegrityLevel, NULL, dwSizeIntgtyLvl, &dwSizeIntgtyLvl) &&
::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
BYTE* pbIntgtyLvl = new BYTE[dwSizeIntgtyLvl];
if(pbIntgtyLvl)
{
TOKEN_MANDATORY_LABEL* pTML = (TOKEN_MANDATORY_LABEL*)pbIntgtyLvl;
DWORD dwSizeIntgtyLvl2;
if(GetTokenInformation(hToken, TokenIntegrityLevel, pTML, dwSizeIntgtyLvl, &dwSizeIntgtyLvl2) &&
dwSizeIntgtyLvl2 <= dwSizeIntgtyLvl)
{
dwIntgtyLvl = *GetSidSubAuthority(pTML->Label.Sid,
(DWORD)(UCHAR)(*GetSidSubAuthorityCount(pTML->Label.Sid)-1));
}

//Free mem
delete[] pbIntgtyLvl;
pbIntgtyLvl = NULL;
}
}

::CloseHandle(hToken);
}

return dwIntgtyLvl;
}

В нормальном потоке событий я ожидал бы получить значение 0x2000 за SECURITY_MANDATORY_MEDIUM_RID, или же 0x3000 за SECURITY_MANDATORY_HIGH_RID, но если у меня уже есть одна учетная запись пользователя Windows, и если я затем переключаю пользователей и выполняю вход с другой учетной записью пользователя, описанный выше метод даст мне значение 0x2010 для обязательного уровня целостности.

Кто-нибудь знает, что означает это значение?

4

Решение

Вы не принимаете во внимание, что уровни целостности используют диапазоны значений, где токену / процессу может быть присвоено значение в диапазоне значений для его уровня целостности. Вы ищете только конкретные значения.

Ненадежная целостность может иметь любое значение между SECURITY_MANDATORY_UNTRUSTED_RID (включительно) и SECURITY_MANDATORY_LOW_RID (Не включено).

Низкая целостность может быть любым значением между SECURITY_MANDATORY_LOW_RID (включительно) и SECURITY_MANDATORY_MEDIUM_RID (Не включено).

Средняя целостность может быть любым значением между SECURITY_MANDATORY_MEDIUM_RID (включительно) и SECURITY_MANDATORY_HIGH_RID (Не включено). Что вы видите в своем примере.

Высокая целостность может быть любой ценностью между SECURITY_MANDATORY_HIGH_RID (включительно) и SECURITY_MANDATORY_SYSTEM_RID (Не включено).

Любое значение на уровне или выше SECURITY_MANDATORY_SYSTEM_RID зарезервировано для системы.

В документации есть таблица, показывающая это:

Дизайн механизма целостности Windows

Таблица 2 Определенные уровни целостности и соответствующие значения

Значение Описание Символ

0x0000 Ненадежный уровень SECURITY_MANDATORY_UNTRUSTED_RID
0x1000 Низкий уровень целостности SECURITY_MANDATORY_LOW_RID
0x2000 Средний уровень целостности SECURITY_MANDATORY_MEDIUM_RID
0x3000 Высокий уровень целостности SECURITY_MANDATORY_HIGH_RID
0x4000 Уровень целостности системы SECURITY_MANDATORY_SYSTEM_RID
4

Другие решения

Это описано в нижней части страницы MSDN на Дизайн механизма целостности Windows:

RID разделены интервалами 0x1000, чтобы в будущем можно было определить дополнительные уровни. Разделение также позволяет назначить уровень целостности процессу, который немного выше среднего: например, для достижения определенных целей проектирования системы.

Приложения, запускаемые с правами UIAccess для стандарта
пользователю присваивается немного более высокое значение уровня целостности в
токен доступа. Уровень целостности токена доступа для UIAccess
приложение для обычного пользователя — это значение средней целостности
уровень плюс шаг 0x10. Более высокий уровень целостности для
Приложения UIAccess предотвращают другие процессы на том же рабочем столе в
средний уровень целостности от открытия объекта процесса UIAccess

5

По вопросам рекламы [email protected]