2011-07-29 26 views
7

MSDN說如果RevertToSelf()失敗,程序應立即終止,因爲否則它會繼續運行在被模擬的客戶端名稱上,這是不合適的。現在假設我做ImpersonateSelf()失敗後RevertToSelf()是否會致命?

ImpersonateSelf(SecurityImpersonation); 

,並調用成功,然後我打電話RevertToSelf(),後者失敗。線程繼續以當前進程的權限運行。它也是非常糟糕的?

+0

這似乎是不可能失敗的功能之一。我能想到的唯一的失敗場景就是在模擬你自己之後(儘管我懶得去嘗試)在DACL中拒絕線程(或進程?)的「Set Thread Token」權限。關於模仿的事情是它影響線程嘗試訪問的所有內容。我可能會認爲,在「不可能」和採取預防措施的意義上,嚴重失敗是嚴重的(儘管假扮和冒充你自己之間可能沒有實際區別)。 – Luke

回答

4

我喜歡你的問題,而MSDN對此並不清楚。

我看着Programming Windows Security(基思·布朗),112頁至117 ImpersonateSelf完成所有的工作,你可以做自己通過調用

  • OpenProcessToken
  • DuplicateTokenEx(... ... TokenImpersonation)
  • SetThreadToken
  • CloseHandle的

雖然RevertToSelf僅僅是

SetThreadToken(0,0) 

呼叫傳遞兩個空參數指示要恢復到先前的令牌的方法。您不必處理模擬與主令牌和令牌訪問權限。電話會一直成功。

如果你看看RpcRevertToSelf函數的錯誤代碼,你會發現RPC相關的代碼不在,唯一的失敗模式就是如果你不模仿。

我說這是安全的,假設RevertToSelf(從ImpersonateSelf調用同一個線程)將始終成功。

相關問題