管理員權限運行應用程序

Vista 之前的系統,當用戶使用管理員賬戶登錄時,一個安全令牌會被創建,之後操作系統訪問一些安全資源時會用到它,由 Windows Explorer 開始,這個安全令牌會同新創建的進程關聯,進而也影響到它們的子進程。惡意軟件也會使用這個安全令牌運行,它就能訪問到任意的資源。

從 Windows Vista 開始,如果一個用戶作爲系統管理員登錄,除了相應的安全令牌創建之外,還創建了一個受限令牌(Filtered token),這個令牌僅有標準用戶的權限。從 Windows Explorer 開始,受限令牌與每一個新創建的進程相關聯,如果一個用戶要訪問高安全的資源時,必須告訴操作系統提升權限,且只是在這個進程邊界中執行,也就是說必須在進程開始之前申請,這就是用戶賬戶控制。

自動提升一個進程的權限

如果一個應用程序必須使用管理員權限運行,比如程序的安裝進程,每次你的應用程序運行時操作系統會自動提示用戶進行權限提升。

可執行文件中如果被發現嵌入了一個特定類型的資源(RT_MANIFEST),那麼系統會查找 <trustInfo> 部分並解析它的內容,以下是一個清單文件的一部分:

?
1
2
3
4
5
6
7
8
9
...
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level='requireAdministrator'/>
        </requestedPrivileges>
    </security>
</trustInfo>
...

另一種方法是將這部分內容放到一個後綴爲 .manifest 的文件中,並將這個文件置於可執行文件相同的目錄中。

除了使用清單文件外,系統還使用一組特定的規則將一個可執行文件識別爲設置程序。

手動提升進程權限

CreateProcess 函數中沒有選項與提升權限有關,用戶可以使用 ShellExecuteEx(LPSHELLEXECUTEINFO pExecInfo) 函數手動申請一個進程提高執行權限,如果用戶拒絕權限提升,ShellExecuteEx 返回 FALSE,GetLastError 返回 ERROR_CANCELLED。SHELLEXECUTEINFO 成員 lpVerb 必須設置爲 “runas”,lpFile 成員包含要求提升權限的可執行文件的路徑。一旦一個進程以提升的權限運行,它隨後使用 CreateProcess 創建的子進程都會以相同的權限的執行,可是如果一個使用受限令牌啓動的進程試圖創建一個需要提升權限的進程,CreateProcess 會失敗,GetLastError 返回 ERROR_ELEVATION_REQUIRED。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章