2015-07-01 35 views
4

我正在用戶模式進程中運行以下代碼段,該進程在Windows用戶帳戶登錄到工作站時啓動。或者換句話說,其路徑被放置在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run註冊表項中。什麼是0x2010的強制性完整性等級值?

該代碼應該確定我的用戶進程的mandatory integrity level。它會爲這樣的:

DWORD getMIL() 
{ 
    //Try to get integrity level 
    //-1           Unknown 
    //SECURITY_MANDATORY_UNTRUSTED_RID    0x00000000 Untrusted. 
    //SECURITY_MANDATORY_LOW_RID     0x00001000 Low integrity. 
    //SECURITY_MANDATORY_MEDIUM_RID     0x00002000 Medium integrity. 
    //SECURITY_MANDATORY_MEDIUM_PLUS_RID   SECURITY_MANDATORY_MEDIUM_RID + 0x100 Medium high integrity. 
    //SECURITY_MANDATORY_HIGH_RID     0X00003000 High integrity. 
    //SECURITY_MANDATORY_SYSTEM_RID     0x00004000 System integrity. 
    //SECURITY_MANDATORY_PROTECTED_PROCESS_RID  0x00005000 Protected process. 
    DWORD dwIntgtyLvl = -1; 

    HANDLE hToken; 
    if(OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken)) 
    { 

     DWORD dwSizeIntgtyLvl = 0; 
     if(!GetTokenInformation(hToken, TokenIntegrityLevel, NULL, dwSizeIntgtyLvl, &dwSizeIntgtyLvl) && 
      ::GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
     { 
      BYTE* pbIntgtyLvl = new BYTE[dwSizeIntgtyLvl]; 
      if(pbIntgtyLvl) 
      { 
       TOKEN_MANDATORY_LABEL* pTML = (TOKEN_MANDATORY_LABEL*)pbIntgtyLvl; 
       DWORD dwSizeIntgtyLvl2; 
       if(GetTokenInformation(hToken, TokenIntegrityLevel, pTML, dwSizeIntgtyLvl, &dwSizeIntgtyLvl2) && 
        dwSizeIntgtyLvl2 <= dwSizeIntgtyLvl) 
       { 
        dwIntgtyLvl = *GetSidSubAuthority(pTML->Label.Sid, 
         (DWORD)(UCHAR)(*GetSidSubAuthorityCount(pTML->Label.Sid)-1)); 
       } 

       //Free mem 
       delete[] pbIntgtyLvl; 
       pbIntgtyLvl = NULL; 
      } 
     } 

     ::CloseHandle(hToken); 
    } 

    return dwIntgtyLvl; 
} 

在事件的正常流動,我期望得到的0x2000的價值SECURITY_MANDATORY_MEDIUM_RID,或0x3000SECURITY_MANDATORY_HIGH_RID,但如果我有一個Windows用戶帳戶已經登錄,如果然後我切換用戶,並使用另一個用戶帳戶登錄,上面的方法將爲我提供值爲0x2010的強制性完整性級別。

有誰知道這個值是什麼意思?

回答

4

您還沒有考慮到完整性級別使用值範圍,該介質完整性級別其中的令牌/爲其完整性級別分配一個值範圍內的值。您只在尋找特定的值。

不可信完整性可以是SECURITY_MANDATORY_UNTRUSTED_RID(含)和SECURITY_MANDATORY_LOW_RID(不含)之間的任何值。

低完整性可以是SECURITY_MANDATORY_LOW_RID(含)和SECURITY_MANDATORY_MEDIUM_RID(不含)之間的任何值。

中等完整性可以是SECURITY_MANDATORY_MEDIUM_RID(含)和SECURITY_MANDATORY_HIGH_RID(不含)之間的任何值。你在你的例子中看到了哪一個。

高完整性可以是SECURITY_MANDATORY_HIGH_RID(含)和SECURITY_MANDATORY_SYSTEM_RID(不含)之間的任何值。

任何等於或高於SECURITY_MANDATORY_SYSTEM_RID的值都爲系統保留。

還有就是文檔中的表格顯示本:

Windows Integrity Mechanism Design

 
Table 2 Defined integrity levels and corresponding values 

Value Description    Symbol 

0x0000 Untrusted level   SECURITY_MANDATORY_UNTRUSTED_RID 
0x1000 Low integrity level  SECURITY_MANDATORY_LOW_RID 
0x2000 Medium integrity level SECURITY_MANDATORY_MEDIUM_RID 
0x3000 High integrity level SECURITY_MANDATORY_HIGH_RID 
0x4000 System integrity level SECURITY_MANDATORY_SYSTEM_RID 
+0

嗯。有趣。謝謝。我不知道這些級別可能是兩者之間的任意值。假設,我可以用MIL的'0x2123'運行我的用戶進程,對嗎? – c00000fd

+1

@ c00000fd沒錯。它們只是任意值 - 當它們與其他進程的IL進行比較時,它們只有意義。 –

+0

@JonathanPotter:好的。謝謝你們倆。我今天剛學到了一些新東西! – c00000fd

5

這是正確的描述在MSDN頁面底部的Windows Integrity Mechanism Design

的RID將通過爲0x1000間隔分開,以便在未來的其他級別的定義。分離還允許爲稍高於中等程度的進程分配完整性級別:例如,以滿足特定的系統設計目標。

...

了與UIAccess權限啓動了一個標準的 用戶應用程序被分配在 訪問令牌稍微完整性級別較高的價值。標準用戶的UIAccess應用程序的訪問令牌完整性級別爲中級完整性 級別的值,加上0x10的增量。對於 UIAccess應用程序的完整性級別較高阻止同一桌面上的其他進程在 從打開UIAccess過程對象

+0

哦,我明白了。欣賞它。我想我錯過了那部分。 – c00000fd

相關問題