Я выполняю следующий фрагмент кода в своем процессе пользовательского режима, который запускается при входе учетной записи пользователя 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
для обязательного уровня целостности.
Кто-нибудь знает, что означает это значение?
Вы не принимаете во внимание, что уровни целостности используют диапазоны значений, где токену / процессу может быть присвоено значение в диапазоне значений для его уровня целостности. Вы ищете только конкретные значения.
Ненадежная целостность может иметь любое значение между 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
Это описано в нижней части страницы MSDN на Дизайн механизма целостности Windows:
RID разделены интервалами 0x1000, чтобы в будущем можно было определить дополнительные уровни. Разделение также позволяет назначить уровень целостности процессу, который немного выше среднего: например, для достижения определенных целей проектирования системы.
…
Приложения, запускаемые с правами UIAccess для стандарта
пользователю присваивается немного более высокое значение уровня целостности в
токен доступа. Уровень целостности токена доступа для UIAccess
приложение для обычного пользователя — это значение средней целостности
уровень плюс шаг 0x10. Более высокий уровень целостности для
Приложения UIAccess предотвращают другие процессы на том же рабочем столе в
средний уровень целостности от открытия объекта процесса UIAccess