access token

access token

access token是Windows作業系統安全性的一個概念。一個訪問令牌包含了此登入會話的安全信息。當用戶登入時,系統創建一個訪問令牌然後以該用戶身份運行的的所有進程都擁有該令牌的一個拷貝。

該令牌唯一表示該用戶、用戶的組和用戶的特權。系統使用令牌控制用戶可以訪問哪些安全對象,並控制用戶執行相關係統操作的能力。有兩種令牌:主令牌和模擬的令牌。主令牌是與進程相關的;模擬的令牌是與模擬令牌的執行緒相關的。

基本介紹

  • 中文名:訪問令牌
  • 外文名:access token
  • 屬於:進程或執行緒的許可權問題
  • 擁有:某種特權
  • 執行:相關係統操作的能力
概念,取得方法,進行操作,關聯特權,調整特權,主令牌,

概念

進程擁有某種令牌就表示它擁有某種特權。什麼是特權呢?特權是指用戶進程進行各種系統操作的權利。如:關機,載入設備驅動程式,改變系統時間也是一種特權。可以對用戶或用戶所在的組授予特權。見圖。
WinNT定義的特權
在WinNT.h頭檔案中定義了這些特權的名稱:
#define SE_CREATE_TOKEN_NAME TEXT("SeCreateTokenPrivilege")
#define SE_ASSIGNPRIMARYTOKEN_NAME TEXT("SeAssignPrimaryTokenPrivilege")
#define SE_LOCK_MEMORY_NAME TEXT("SeLockMemoryPrivilege")
#define SE_INCREASE_QUOTA_NAME TEXT("SeIncreaseQuotaPrivilege")
#define SE_UNSOLICITED_INPUT_NAME TEXT("SeUnsolicitedInputPrivilege")
#define SE_MACHINE_ACCOUNT_NAME TEXT("SeMachineAccountPrivilege")
#define SE_TCB_NAME TEXT("SeTcbPrivilege")
#define SE_SECURITY_NAME TEXT("SeSecurityPrivilege")
#define SE_TAKE_OWNERSHIP_NAME TEXT("SeTakeOwnershipPrivilege")
#define SE_LOAD_DRIVER_NAME TEXT("SeLoadDriverPrivilege")
#define SE_SYSTEM_PROFILE_NAME TEXT("SeSystemProfilePrivilege")
#define SE_SYSTEMTIME_NAME TEXT("SeSystemtimePrivilege")
#define SE_PROF_SINGLE_PROCESS_NAME TEXT("SeProfileSingleProcessPrivilege")
#define SE_INC_BASE_PRIORITY_NAME TEXT("SeIncreaseBasePriorityPrivilege")
#define SE_CREATE_PAGEFILE_NAME TEXT("SeCreatePagefilePrivilege")
#define SE_CREATE_PERMANENT_NAME TEXT("SeCreatePermanentPrivilege")
#define SE_BACKUP_NAME TEXT("SeBackupPrivilege")
#define SE_RESTORE_NAME TEXT("SeRestorePrivilege")
#define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege")
#define SE_DEBUG_NAME TEXT("SeDebugPrivilege")
#define SE_AUDIT_NAME TEXT("SeAuditPrivilege")
#define SE_SYSTEM_ENVIRONMENT_NAME TEXT("SeSystemEnvironmentPrivilege")
#define SE_CHANGE_NOTIFY_NAME TEXT("SeChangeNotifyPrivilege")
#define SE_REMOTE_SHUTDOWN_NAME TEXT("SeRemoteShutdownPrivilege")
#define SE_UNDOCK_NAME TEXT("SeUndockPrivilege")
#define SE_SYNC_AGENT_NAME TEXT("SeSyncAgentPrivilege")
#define SE_ENABLE_DELEGATION_NAME TEXT("SeEnableDelegationPrivilege")
#define SE_MANAGE_VOLUME_NAME TEXT("SeManageVolumePrivilege")
#define SE_IMPERSONATE_NAME TEXT("SeImpersonatePrivilege")
#define SE_CREATE_GLOBAL_NAME TEXT("SeCreateGlobalPrivilege")
#define SE_TRUSTED_CREDMAN_ACCESS_NAME TEXT("SeTrustedCredManAccessPrivilege")
#define SE_RELABEL_NAME TEXT("SeRelabelPrivilege")
#define SE_INC_WORKING_SET_NAME TEXT("SeIncreaseWorkingSetPrivilege")
#define SE_TIME_ZONE_NAME TEXT("SeTimeZonePrivilege")
#define SE_CREATE_SYMBOLIC_LINK_NAME TEXT("SeCreateSymbolicLinkPrivilege")

取得方法

通過API函式OpenProcessToken 取得進程令牌。其定義如下:
BOOL WINAPI OpenProcessToken(
__in HANDLE ProcessHandle, //進程句柄。通過GetCurrentProcess函式取得當前進程句柄
__in DWORD DesiredAccess, //要對令牌進行何種操作。如TOKEN_ADJUST_PRIVILEGES用於調整許可權
__out PHANDLE TokenHandle //進程令牌句柄
);
如下代碼取得進程的令牌,並告訴系統我們想調整令牌的許可權
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,
&hToken)) {
......
}

進行操作

Value
Meaning
TOKEN_ADJUST_DEFAULT
改變令牌所有者、主組或訪問控制列表DACL
TOKEN_ADJUST_GROUPS
改變令牌的組屬性
TOKEN_ADJUST_PRIVILEGES
enable or disable 令牌的特權
TOKEN_ADJUST_SESSIONID
調整令牌的Session ID。進程需要 SE_TCB_NAME 特權.
TOKEN_ASSIGN_PRIMARY
為進程分配主令牌。需要 SE_ASSIGNPRIMARYTOKEN_NAME 特權
TOKEN_DUPLICATE
複製令牌
TOKEN_EXECUTE
合併 STANDARD_RIGHTS_EXECUTE 和 TOKEN_IMPERSONATE.
TOKEN_IMPERSONATE
附加一個模擬令牌到進程
TOKEN_QUERY
查詢令牌
TOKEN_QUERY_SOURCE
查詢令牌源
TOKEN_READ
合併 STANDARD_RIGHTS_READ 和TOKEN_QUERY.
TOKEN_WRITE
合併 STANDARD_RIGHTS_WRITE, TOKEN_ADJUST_PRIVILEGES, TOKEN_ADJUST_GROUPS, 和 TOKEN_ADJUST_DEFAULT.
TOKEN_ALL_ACCESS
合併所有可能的操作

關聯特權

TOKEN_PRIVILEGES令牌特權結構體,該結構體定義了訪問令牌所擁有的一系列特權。其原型定義如下:
typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount; //特權數量(數組的長度)
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; //特權數組
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
其中,Privileges數組類型為 LUID_AND_ATTRIBUTES結構體,其原型定義如下:
typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid; //局部唯一標識符,代表某種特權的Value
DWORD Attributes; //Luid的屬性,代表特權的屬性(Enabled or Disabled)
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
其特權屬性Attributes可以是如下常量:
含義
SE_PRIVILEGE_ENABLED
使特權有效
SE_PRIVILEGE_ENABLED_BY_DEFAULT
使特權默認有效
SE_PRIVILEGE_REMOVED
移除該特權
SE_PRIVILEGE_USED_FOR_ACCESS
取得對象或服務的訪問權

調整特權

取得特權的LUID值
首先通過LookupPrivilegeValue函式取得某種特權的LUID,通過特權的名稱查找特權的LUID。
BOOL WINAPI LookupPrivilegeValue(
__in_opt LPCTSTR lpSystemName, //特權所在的系統名稱,NULL表示本地系統
__in LPCTSTR lpName, //特權名稱,在WInNT.h 中定義的特權名稱
__out PLUID lpLuid //取得的特權的LUID
);
如下代碼取得SE_DEBUG_NAME特權的LUID,並將特權屬性設為SE_PRIVILEGE_ENABLED
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
調整令牌特權
AdjustTokenPrivileges函式可以調整令牌的特權。函式定義如下:
BOOL WINAPI AdjustTokenPrivileges(
__in HANDLE TokenHandle, //令牌句柄
__in BOOL DisableAllPrivileges, //是否禁用所有特權,如為TRUE,則忽略NewState參數
__in_opt PTOKEN_PRIVILEGES NewState,//調整為NewState結構定義的特權
__in DWORD BufferLength, //PreviousState 參數的位元組大小
__out_opt PTOKEN_PRIVILEGES PreviousState, 可選,調整之前的TOKEN_PRIVILEGES結構體指針
__out_opt PDWORD ReturnLength //可選,返回的結構體的長度
);
//調用
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);

主令牌

主令牌是由windows核心創建並分配給進程的默認訪問令牌。

相關詞條

熱門詞條

聯絡我們