一、基本概念:
1、A訪問B,A就是訪問的主體,B就是訪問的客體。A的令牌和B的安全描述符共同決定A是否可以問B。
訪問的主體的進程。因為線程沒有自己的權限,而是來源於線程所屬於的進程。一個進程中的所有線程都具有同樣權限,因此可以把進程的權限看作訪問的主體。
訪問的客體是安全對象,所有被訪問的對象都具有安全描述,包括文件、注冊表、事件(Evnet)、互斥(Mutex)、管道等。
2、進程-----訪問令牌
訪問令牌:是操作系統專門表示用戶的權限的數據結構。有兩部組成,一個是令牌所表示的用戶(如:用戶標識符SID)及用戶組等,另一個部分是“權限”(privilege)
備注:權限是一個列表,每種取限是列表中一項。權限列表存在於進程的訪問令牌中。
3、對象-----安全描述符
安全描述符:是安全屬性(SECURITY_ATTRIBUTES結構體)的表示形式,其包括訪問控制列表(ACL)。
訪問控制列表有兩種:一種是選擇訪問控制列表(discretionary access control list,DACL),另一種是系統訪問控制列表(system access control list,SACL)。DACL決定了用戶和用戶組能否訪問這個對象,SACL控制了嘗試訪問安全對象的檢測信息的繼承關系(這個我也不太清楚)。
備注:DACL是訪問控制的常用信息,DACL中包括一個訪問控制入口(AccessControlEntries,ACE)列表。ACE表明了用戶是否能進行操作以及能進行哪種操作。系統在進行訪問控制檢測時,會依次檢測DACL中的ACE,直到被允許或被拒絕因此在列表前端的ACE優於列表后端的ACE。
二、具體對應的操作
1、進程訪問安全對象時,只會用到SID,與進程的權限無關。
2、進程進行特殊操作時,用到的是權限,例如:如關閉系統、修改系統時間、加載設備驅動等。
3、創建進程相關API
(1)CreateProcess(),該函數所創建的進程使用的訪問令牌是當前登錄用戶的訪問令牌。
(2)CreateProcessAsUser()和CreateProcessWithTokenW()等,可以指定用戶令牌,需要使用LogonUser()登錄用戶,通過LogonUser()函數的返回值得到用戶令牌。