Привелегии ( Privileges )
Когда вы заходите на компьютер под определенным аккаунтом , вы получаете определенные привилегии . Таблица наиболее важных привилегий для ОС WINDOWS:
Название |
Внутреннее имя |
#define (winnt.h) |
1.Backup Files |
SeBackupPrivilege |
SE_BACKUP_NAME |
2.Restore files |
SeRestorePrivilege |
SE_RESTORE_NAME |
3.Act Operation System |
SeTcbPrivilege |
SE_TCB_NAME |
4.Debug Programs |
SeDebugPrivilege |
SE_DEBUG_NAME |
5.Replace ProcessLevelToken |
SeAssignPrimaryToken |
SE_ASSIGNPRIMARYTOKEN_NAME |
6.Load Device Drivers |
SeLoadDriverPrivilege |
SE_LOAD_DRIVER_NAME |
7.Take Ownership of Files |
SeTakeOwnershipPrivrlege |
SE_TAKE_OWNERSHIP_NAME |
Например , чтобы назначить привилегию 1. Backup Files , нужно выполнить код : OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) TOKEN_PRIVILEGES newPrivs; LookupPrivilegeValue (NULL, SE_BACKUP_NAME,&newPrivs.Privileges[0].Luid) newPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; newPrivs.PrivilegeCount = 1; AdjustTokenPrivileges(hToken, FALSE, &newPrivs , 0, NULL, NULL) Когда пользователь получает аккаунт к машине , ОС создает структуру , называемую token , в которой хранится информация о SID пользователя , SID группы , к которой он принадлежит , и этот token применим к каждому процессу,выполняемому пользователем. Получить информацию о пользователе : EXTENDED_NAME_FORMAT enf[] = {NameDisplay,NameSamCompatible,NameUserPrincipal}; for (int i=0; i < sizeof(enf) / sizeof(enf[0]); i++) { char szName[128]; DWORD cbName = sizeof(szName); if (GetUserNameEx(enf[i],szName,&cbName)) printf("Name (format %d): %s\n",enf[i],szName);} Получить информацию о привилегиях : DWORD dwSize = 0; TOKEN_PRIVILEGES *pPrivileges = (PTOKEN_PRIVILEGES) AllocateTokenInfoBuffer(hToken, TokenPrivileges, &dwSize); BOOL bRes = GetTokenInformation(hToken,TokenPrivileges,pPrivileges, dwSize, &dwSize); for (DWORD i=0; i < pPrivileges- >PrivilegeCount; i++) { char szPrivilegeName[128]; DWORD dwPrivilegeNameLength=sizeof(szPrivilegeName); if (LookupPrivilegeName(NULL, &pPrivileges->Privileges[i].Luid, szPrivilegeName, &dwPrivilegeNameLength)) printf("\t%s (%lu)\n", szPrivilegeName, } Начиная с windows 2000 , token-ы можно модифицировать "на лету" , задавая ограничения на выполнение определенных операций и модифицируя его привилегии . В следующем примере берется token с правами администратора и на него накладываются ограничения : SID_AND_ATTRIBUTES SidToDisable[1]; SidToDisable[0].Sid = pAdminSID; SidToDisable[0].Attributes = 0; // Get the current process token. HANDLE hOldToken = NULL; OpenProcessToken(GetCurrentProcess(),TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_ADJUST_DEFAULT, &hOldToken); // Create restricted token from the process token. HANDLE hNewToken = NULL; CreateRestrictedToken(hOldToken,DISABLE_MAX_PRIVILEGE,1,SidToDisable, 0, NULL, 0, NULL, &hNewToken); Windows XP включает в себя встроенный механизм,позволяющий модифицировать token , который еще называется Safer . Cледующий пример показывает его использование : if (SaferCreateLevel(SAFER_SCOPEID_USER,SAFER_LEVELID_NORMALUSER,0, &hAuthzLevel, NULL)) { // Generate the restricted token that we will use. HANDLE hToken = NULL; if (SaferComputeTokenFromLevel( hAuthzLevel,NULL,&hToken,0,NULL)) { // Build the path to Cmd.exe to make sure // we're not running a Trojaned Cmd.exe. char szPath[MAX_PATH+1], szSysDir[MAX_PATH+1]; if (GetSystemDirectory(szSysDir, sizeof szSysDir)) { _StringCbPrintf(szPath,sizeof szPath,"%s\\cmd.exe",szSysDir); STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.lpDesktop = NULL; PROCESS_INFORMATION pi; if (!CreateProcessAsUser(hToken,szPath, NULL,NULL, NULL, FALSE, CREATE_NEW_CONSOLE,NULL, NULL, &si, &pi)) printf("CreateProcessAsUser failed (%lu)\n", GetLastError() ); } } } В 2003-сервере добавлена функция , с помощью которой для конкретного приложения можно удалять какие-то привилегии , которые не используются в нем конкретно , не трогая при этом привилегии самого аккаунта . Для этого используется api-функция AdjustTokenPrivileges . В XP появились 2 новых типа аккаунта : 1. local service account 2. network service account Они похожи тем , что получают доступ лишь к сетевым ресурсам .