Share via


如何在 Windows Vista 中實作完整性機制

Windows 完整性機制在 Windows Vista 中使用許多方式。 其主要目的是限制在較不值得信任的相同使用者帳戶下執行的應用程式存取權限。 機制可防止較不信任的程式碼在較高層級修改物件。 系統管理員群組或系統控制下的大部分物件都有選擇性存取控制清單 (DACL) ,通常授與系統管理員和系統的完整控制許可權,以及讀取和執行已驗證使用者的許可權。 系統管理員群組和系統控制下的資源範例包括應用程式的 Program Files 目錄或登錄的HKEY_LOCAL_MACHINE hive。 完整性機制不會增強已正確設定的物件安全性,以限制不同的使用者帳戶或群組存取它們。 完整性機制的主要用途是解決程式在不同許可權下存取相同使用者安全性主體下的資源。

需要額外保護的相同使用者安全性主體所控制的資源主要位於使用者設定檔 (C:\Users\ < username > 目錄下,以及登錄) 中HKEY_CURRENT_USER hive,以及目前代表該使用者執行的應用程式程式。 Windows Vista 以下列方式使用完整性機制。

  • 在 UAC 中,它會限制以標準使用者許可權執行的進程,以及管理員核准模式中以完整系統管理許可權執行的提高進程之間的存取權。
  • COM 安全性知道完整性層級,而且不允許較低完整性用戶端系結至在較高完整性層級執行的類別實例。
  • 在預設安全性設定中,它會限制系統磁片區根資料夾的存取權。
  • 在 Protected Mode Internet Explorer 中,它會限制在網際網路瀏覽器中執行的程式碼修改使用者資料或使用者設定檔設定的能力。
  • 若要讓以低完整性執行的應用程式具有可寫入的檔案位置,它會將使用者設定檔中的特定資料夾指派為低完整性層級。

完整性機制是 Windows Vista 安全性架構的一部分。 經過一段時間後,處理不受信任的輸入 (特定應用程式主要會更新網際網路對向) ,以利用低完整性層級執行的能力。 只要使用者知道輸入資料的來源,個人生產力應用程式就能夠以中完整性層級執行。 對於大部分的應用程式而言,完整性機制是完全透明的,而且不會干擾應用程式功能。 應用程式服務可以更新,為不同完整性層級的用戶端進程提供更佳的伺服器資源隔離。

完整性層級和 UAC

Windows Vista 中的 UAC 會在使用管理員核准模式時,在相同桌面上執行不同層級的多個程式。 程式會根據建立進程時指派給進程的安全性存取權杖,有不同的許可權。 具有標準使用者帳戶的使用者在登入期間只會建立一個安全性存取權杖。 標準使用者存取權杖會指派中型完整性層級。 中型完整性標準使用者存取權杖會指派給使用者執行的所有應用程式進程。 受保護的模式 Internet Explorer 等特定應用程式是下列進一步說明的例外狀況。

具有系統管理員群組成員帳戶的使用者,會在登入時建立兩個安全性存取權杖,這些權杖會連結在一起。 一個存取權杖是一種標準使用者存取權杖,指派了中型完整性層級,其具有僅用於拒絕存取檢查的系統管理員群組,以及移除某些系統管理許可權。 第二個存取權杖是一種完整許可權、提高許可權的存取權杖,指派高完整性層級,因為系統管理員群組和管理許可權存在於存取權杖中。 存取權杖會連結,因為它們與該使用者帳戶的相同互動式登入有關。 兩個存取權杖都有相同的使用者 SID 和來自 Active Directory 的相同全域群組 (,但網域和企業管理員) 的篩選群組除外。

Windows 檔案總管 (也稱為殼層) ,且所有非系統管理員工作都會指派標準使用者、中完整性存取權杖。 對於屬於 Administrators 群組成員的使用者帳戶,幾乎所有應用程式都是使用中完整性存取權杖來執行。 NO_WRITE_UP完整性原則不會限制中型進程的存取權限,以存取具有隱含中型物件強制標籤的物件。 完整性機制對中型完整性層級的應用程式而言是透明的,除非其設計目的是控制可能以較高許可權層級執行的其他進程。 Windows UI 自動化是一個應用程式範例,其設計目的是要控制其他進程。

UAC 管理員核准模式可讓使用者在提供完整許可權、提高許可權的存取權杖之後啟動系統管理工作和應用程式。 作業系統必須限制低許可權 (標準使用者) 程式的能力,以直接竄改在相同使用者 SID 下執行的較高許可權 (系統管理員) 進程。 Windows 完整性機制會限制中完整性進程在高完整性進程上可以擁有的存取權限。 進程管理員 (Windows 核心的一部分,) 指派強制原則選項NO_READ_UP和NO_WRITE_UP,以限制較低完整性進程開啟更高的完整性進程以進行讀取或寫入存取。

較低完整性進程只有泛型執行存取權。 泛型執行存取包括下列專案:

  • SYNCHRONIZE,PROCESS_QUERY_LIMITED_INFORMATION
  • PROCESS_TERMINATE

對較高完整性程式的一般讀取存取 (PROCESS_VM_READ進程虛擬記憶體的存取權,而PROCESS_QUERY_INFORMATION) 僅限於封鎖較低許可權進程的能力,而無法存取可能包含密碼資料或其他金鑰資料進行驗證的記憶體。 NO_WRITE_UP原則會封鎖對較高完整性程式的一般寫入存取。 一般寫入進程存取權限包括:

  • PROCESS_CREATE_THREAD
  • PROCESS_VM_OPERATION
  • PROCESS_VM_WRITE
  • PROCESS_DUP_HANDLE
  • PROCESS_SET_QUOTA
  • PROCESS_SET_INFORMATION
  • PROCESS_SET_PORT

目前的使用者登錄區

使用者設定檔中的大部分物件未獲指派明確的強制標籤,因此具有隱含的預設完整性層級。 這適用于登錄HKEY_CURRENT_USER (HKCU) hive。 在 HKCU 下建立的索引鍵具有隱含的中型完整性層級。 這表示,對於屬於 Administrators 群組成員的使用者而言,HKCU hive 可透過使用中型完整性標準使用者存取權杖或高完整性的完整系統管理員存取權杖執行的應用程式來寫入。 這必須是應用程式相容性原因的情況。 回想一下,HKEY_LOCAL_MACHINE (HKLM) hive 具有預設安全性原則,可授與系統管理員和系統完整控制,以及使用者讀取和執行存取權。 HKLM Hive 只能由指派完整系統管理員存取權杖的提升許可權進程修改。 HKLM Hive 不受高強制標籤的保護。

由於沒有明確強制標籤的物件的預設完整性層級為中,因此,屬於系統管理員群組成員的使用者可能會在不同的許可權層級執行程式, (中和高) 共用 HKCU 和使用者設定檔資料。 Windows Vista 不會強制執行中完整性與高完整性程式之間的嚴格界限。 允許高完整性程式「讀出」。 使用完整許可權、高完整性存取權杖執行的應用程式通常會從 HKCU 讀取組態資訊,或接受影響高完整性程式列為的輸入檔。 以完整許可權執行的應用程式應該使用 HKLM 來儲存只有系統管理員可修改的組態資訊。 完整許可權應用程式也需要在處理使用者可修改的檔案之前,先確認使用者輸入資料格式良好。

COM 具有完整性感知

COM 是建置應用程式元件和物件服務的架構。 COM 基礎結構知道呼叫 CoCreateInstance 的用戶端完整性層級,以及執行類別實例的伺服器進程。 COM 功能的區域,其中完整性層級會影響行為:

  • COM 提高許可權 Moniker 可讓用戶端在系統管理員提供同意之後,以高完整性層級啟動提升許可權的服務,或標準使用者提供明確的系統管理員認證。
  • 在中完整性層級上方執行提升許可權的伺服器類別必須具有 HKLM 登錄區中定義的 CLSID。
  • 除非伺服器以程式設計方式允許從較低用戶端存取,否則 COM 會防止較低完整性層級的用戶端系結至執行中伺服器實例。

COM 提高許可權 Moniker 可讓低或中完整性層級的應用程式在具有高完整性提高許可權的進程中啟動 COM 服務。 提高許可權 Moniker 允許設計為執行提升許可權且不適合完整應用程式相容性的特定工作。 COM 提高許可權與 UAC 提高許可權整合。 提高許可權的 COM 伺服器進程會獲指派高完整性的完整許可權、提高許可權的存取權杖。 COM 不允許較低層級的用戶端系結至較高完整性層級的伺服器執行中實例。

如果 COM 伺服器是設計來支援來自較低完整性用戶端的連線,則伺服器可以程式設計方式修改 CLSID 登錄中的啟動/啟用許可權,以允許從較低完整性用戶端進行系結。 COM 會使用強制標籤 ACE 中的NO_EXECUTE_UP強制原則來控制用戶端是否允許系結至較高完整性層級的伺服器實例。 COM 啟動/啟用存取權限會對應至 COM 用來檢查啟用的一般執行存取權限GENERIC_MAPPING。 與 物件相關聯的強制標籤中的完整性層級會識別允許系結至伺服器之用戶端的最低完整性層級。 與檔案系統存取類似,預設的隱含強制原則可讓中型完整性用戶端系結至伺服器。

針對設計為允許低完整性用戶端系結至伺服器實例的 COM 伺服器,COM 啟用許可權是由伺服器程式碼所設定。

允許低完整性用戶端系結至伺服器

  1. 針對低完整性層級,使用NO_EXECUTE_UP (NX) 原則定義強制標籤。 具有低完整性之強制標籤原則之物件安全性描述元的 SDDL 如下:

    O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)

  2. 將字串安全性描述元轉換為二進位安全性描述元。

  3. 使用二進位安全性描述元,為伺服器 CLSID 設定 CLSID 的啟動許可權。

COM 安全性 UI dcomcfg.exe不支援完整性層級。

如需 COM 和完整性層級支援的詳細資訊,請參閱 Windows 完整性機制資源 中設定 COM 啟動許可權強制原則的程式碼範例。

系統會將服務指派給系統完整性層級

服務控制管理員 (SCM) 會使用特殊服務帳戶或使用者名稱和密碼來啟動服務進程。 特殊服務帳戶為 LocalSystem、LocalService 和 NetworkService。 在這些服務帳戶下執行的服務具有特殊許可權,例如SE_IMPERSONATE_NAME許可權,可讓服務在模擬其他使用者時採取動作。 Windows Vista 會將系統完整性層級指派給在其中一個特殊服務帳戶下執行之服務的進程物件。 下圖的 [進程總管] 顯示指派給特殊服務帳戶存取權杖的系統完整性層級。

圖 6 服務的系統完整性層級

雖然服務進程具有系統完整性層級,但這些主體所建立的安全性實體物件並未獲指派系統強制標籤。 服務所建立的物件 (,但子進程、執行緒、存取權杖和作業) 具有隱含的中型完整性層級。

Windows Vista 的服務變更描述服務的變更,以改善安全性、可靠性和管理性。 服務變更可藉由隔離會話 0 中的服務,以及隔離服務可以使用服務 SID 存取的資源來改善系統安全性。 特殊服務帳戶的系統完整性等級與服務隔離目標一致。 在系統完整性層級執行的服務進程受到保護,不受較低完整性程式的存取。 可供較低完整性進程開啟服務進程的進程存取權限僅限於下列各項:

  • SYNCHRONIZE
  • PROCESS_QUERY_LIMITED_INFORMATION
  • PROCESS_TERMINATE

某些應用程式是使用可在一或多個服務帳戶中執行的多個合作式程式所設計。 大部分處理序間通訊 (IPC) 進程與服務之間的機制,例如 RPC 不會受到完整性層級的限制。 服務必須特別小心,才能驗證來自低完整性用戶端的輸入。

服務之間的重複控制碼

使用多個進程的服務應用程式有時會設計成在伺服器進程之間重複處理物件,例如檔案。 如果所有進程都在同一個特殊服務帳戶下執行,則服務進程的預設安全性不會引入限制。 在特殊服務帳戶下執行之服務進程上的預設 DACL 不會授與PROCESS_DUP_HANDLE存取權,這是 DuplicateHandle 呼叫的必要專案。 應用程式服務設計工具必須實作功能,才能將服務進程物件上的PROCESS_DUP_HANDLE存取權授與共同進程所使用的另一個使用者帳戶,以便在在不同使用者帳戶下執行的應用程式進程之間共用控制碼。 但是,如果您想要複製控制碼的服務是一個在系統完整性層級執行的特殊服務帳戶,則因為強制標籤原則,在高或中完整性層級執行的共同進程將無法取得PROCESS_DUP_HANDLE。 即使 DACL 授與PROCESS_DUP_HANDLE存取權,強制標籤原則仍不允許存取較低完整性的呼叫端。 如果這種情況會影響服務應用程式設計,則應用程式服務程式碼必須變更,以便起始 DuplicateHandle 的進程在完整性層級高於處理常式來源的完整性層級。 也就是說,較高完整性的服務可以將控制碼複製成自己的進程,做為從較低完整性進程做為控制碼來源的目標。

模擬原則

SE_IMPERSONATE_NAME許可權可讓伺服器進程模擬用戶端進程的安全性內容。 模擬許可權是功能強大的許可權。 完整性機制會將模擬許可權與具有高或系統完整性層級的存取權杖產生關聯。 完整性機制會強制執行主體可以在較高完整性層級模擬用戶端的原則,只有當用戶端具有 Impersonate 許可權時。

套用此原則限制的案例是當低完整性程式詐騙 UI 對系統管理員使用者輸入系統管理員認證時。 惡意程式碼會使用認證來呼叫 LsaLogonUser 和 ImpersonateLoggedOnUser,以嘗試以較高的許可權層級啟動進程。 模擬存取權杖的完整性機制原則是 LsaLogonUser 所傳回之存取權杖的完整性層級必須高於呼叫程式的完整性層級。

高完整性層級的根資料夾

系統分割區的根資料夾,通常是 C:\ 過去用來儲存程式或暫存檔的便利位置,但不建議做法。 需要系統管理員許可權的安裝程式通常會在啟動之前複製到根資料夾。 根資料夾的預設安全性原則是設計來允許已驗證的使用者在根資料夾下建立子資料夾,但只允許系統管理員在根資料夾中建立檔案。 此外,在理想情況下,原則不允許非系統管理使用者修改系統管理員所建立資料夾中的檔案。 此原則很難只針對根資料夾使用 ACL 來定義。

藉由設定套用至子物件但不適用於子容器的高完整性層級的強制標籤,根資料夾的預設安全性會符合此原則。 在中型完整性層級執行程式的標準使用者無法修改系統管理員在根資料夾中建立的檔案,即使 ACL 授與使用者修改存取權也一樣。 根資料夾具有高度完整性的可繼承強制標籤,該標籤為物件繼承,且不會傳播至子資料夾。

下圖顯示 C:\ 上的預設安全性設定根資料夾,包括物件繼承高度完整性的強制標籤。 表 9 顯示影像中縮寫的定義。

表 9 影像縮寫

縮寫 定義

(OI)

物件繼承

(NP)

無傳播

(IO)

僅繼承

(NW)

沒有寫入

圖 7 根資料夾上的強制標籤

低完整性的受保護模式 Internet Explorer

Internet Explorer 是一個應用程式範例,其設計目的是要接受來自網際網路的任意資料和可延伸程式碼。 由於網際網路內容的來源很少經過驗證, (簽署) ,因此我們必須假設來自網際網路的所有輸入都不受信任。 對 Internet Explorer 或任何其他網際網路瀏覽器的攻擊,會示範從網際網路取得之動態內容和資料不受信任的本質。 從安全性觀點來看,我們假設 Internet Explorer 進程本身遭到入侵且不受信任,而且我們會尋找解決方案,以限制瀏覽器上攻擊所造成的潛在損害。 某些瀏覽器型攻擊的建議解決方案會嘗試完全隔離網頁瀏覽器與其他應用程式和資料。 可惜的是,完全隔離瀏覽器對使用者的流覽體驗有顯著的影響,例如能夠自動啟動程式來讀取各種檔案類型,例如.pdf檔案。 如果瀏覽器沒有使用者資料檔案的讀取權限,則完整隔離會影響常見的使用者體驗,例如將圖片上傳至網站。

受保護的模式 Internet Explorer 目標是減少程式可用的存取權限,以限制在瀏覽器中執行之惡意探索的能力,以建立不必要的啟動檔案、修改使用者資料檔案、對瀏覽器組態設定進行令人困擾的變更,或驅動在桌面上執行之其他程式的行為。 在低完整性進程中以受保護模式 Internet Explorer 執行的所有程式碼都會被視為不受信任。 物件的預設中型完整性層級可防止瀏覽器開啟任何目錄、檔案或登錄機碼以進行寫入存取,但明確標示為低完整性的目錄、 檔案或登錄機碼。 UIPI 可防止低完整性瀏覽器程式碼將任何潛在的損害視窗訊息傳送至桌面上執行的其他應用程式。

以低完整性執行的瀏覽器具有使用者資料檔案的讀取權限。 因為 Windows 完整性機制不會強制執行機密性,所以不會限制資訊的流程。 此程式也可以使用預設認證來起始網路連線,例如需要驗證才能連線到網際網路) 或網路印表機裝置以列印網頁時所需的網路 Proxy (伺服器。 低完整性程式也可以起始與其他網路服務的已驗證連線,進而以目前使用者身分向這些伺服器進行驗證。

Internet Explorer 的應用程式設計需要一些重建,才能在低完整性層級的受保護模式下執行。 主要變更是某些程式作業已移出至個別進程,稱為訊息代理程式進程,以中完整性層級執行。 當使用者按一下 Internet Explorer 圖示或 URL 連結時,訊息代理程式進程會在中完整性層級啟動。 訊息代理程式會檢查 URL 和區域原則,並在低完整性層級啟動子進程iexplore.exe,讓網際網路連線並轉譯網頁。 下圖顯示進程總管中的ieuser.exe、中完整性層級的代理程式進程,以及低完整性層級的iexplore.exe進程。

圖 8 受保護的模式 Internet Explorer 程式

Internet Explorer 網頁瀏覽器中的所有使用者體驗都是在低完整性程式中完成。 代理程式會處理一些特定作業,例如變更網際網路選項設定或 [ 另存新檔 ] 對話方塊。 如果 URL 是信任的網站,根據預設區域原則設定,訊息代理程式進程會在中完整性進程中啟動不同實例iexplore.exe。 所有瀏覽器延伸模組和 ActiveX 控制項都會在低完整性程式中執行。 這具有瀏覽器擴充功能的任何潛在惡意探索在低完整性下執行的優點。

Internet Explorer 比其他應用程式更複雜,因為它裝載瀏覽器延伸模組和不是由 Microsoft 開發的 ActiveX 控制項,它會根據不同副檔名的 mime 類型啟動其他應用程式,並將用戶端視窗與單一父視窗框架內的不同應用程式整合。 使用者也會透過瀏覽器從網際網路下載軟體,並立即啟動應用程式套件或應用程式安裝程式。 其中許多作業都需要從較高完整性層級的訊息代理程式協助,以透過使用者進行媒體處理以確認作業。 否則,在瀏覽器中執行的程式碼可能會在系統上安裝惡意軟體,並嘗試修改或刪除使用者的資料。 ActiveX 控制項的安裝是使用需要系統管理員許可權的 UAC 所啟動的提升許可權工作來執行。

由於 Internet Explorer 支援瀏覽器與其他本機應用程式之間的各種使用者互動, (複製和貼上是一個明顯的範例) ,因此限制物件寫入存取的完整性機制不是完整的隔離機制。 受保護模式 Internet Explorer 的設計探討許多不同的互動,並特別針對訊息代理程式和低許可權iexplore.exe程式的行為量身打造,以提供豐富、高度共同作業的使用者體驗。

如需受保護模式 Internet Explorer 的詳細資訊,請參閱瞭解及處理受保護模式 Internet Explorer (https://go.microsoft.com/fwlink/?LinkId=90931) 。