0

我有一個系統服務,它以管理員身份創建一個輔助交互過程,以便它可以訪問某些與桌面相關的資源,包括BlockInput()函數和NVIDIA的NVAPI函數,無法從服務運行。當登錄的用戶是Administrators組的成員,下面的工作:當標準用戶登錄時啓動管理交互過程

  1. 設置權限級別,包括SE_TCB_NAME
  2. 獲取活動會話ID與WTSGetActiveConsoleSessionId()
  3. 獲取登錄的用戶的會話ID與WTSQueryUserToken ()
  4. GetTokenInformation()與TokenLinkedToken
  5. DuplicateTokenEx()與SecurityImpersonation
  6. Launc ()

但是,當我有當前登錄會話是標準用戶而不是管理員中的一個,則步驟4失敗,可能是因爲標準用戶沒有管理級別令牌與它聯繫在一起。這裏有什麼解決方案?我假設我需要獲得其中一位管理員用戶的令牌,但我該怎麼做?如果該用戶不是登錄用戶,它是否仍然可以訪問與當前桌面交互的功能?

+1

您是否嘗試過從目標用戶會話中的csrss實例中複製NT Authority \ SYSTEM用戶令牌?這應該在XP/7上工作,但我還沒有嘗試過8。 – hyru

+0

我可以複製已知管理員成員用戶的令牌嗎?我注意到,當從標準用戶帳戶交互使用桌面期間爲該用戶調用UAC時,系統會要求我提供已知管理員級帳戶的密碼,這使我希望帳戶可以與桌面交互,儘管登錄的用戶是標準用戶。 –

+0

@DisplayName:你不能複製一個令牌而不需要複製一個令牌。除非管理員登錄,否則不會有一個。但是無論你做什麼,都會有風險...... BlockInput不需要管理員權限,執行NVAPI功能? –

回答

2

您可以複製您自己的令牌,然後使用SetTokenInformation函數將重複令牌上的會話更改爲交互式會話。

正如你所注意到的,在交互式會話中運行爲SYSTEM是不鼓勵的,因爲它給交互式用戶開放攻擊你的進程,潛在地獲得提升的特權。 (有關更多信息,請搜索「粉碎攻擊」)。但是,這一關注同樣適用於作爲非管理用戶會話中的管理用戶運行的進程。

理想情況下,您應該在交互式會話中使用非管理進程來執行需要交互式會話的函數,同時使用該服務執行需要管理權限的函數。不應該有任何需要這兩個功能的功能,但是如果NVAPI違反了這條規則,那麼您可以做的事情就不多了。

考慮將流程啓動到交互式用戶會話中專門創建的(並且適當安全的)工作站中,以便將此風險降至最低。

+0

謝謝。我使用CreateDesktop()來避免粉碎攻擊(這似乎也不是從服務運行,所以卸載到這個幫助程序)。助手進程不會向用戶提供任何接口,所以它似乎是安全的。面向用戶的進程是沙箱,並在另一臺桌面上。 –

相關問題