0x2010的强制完整性级别值代表什么?

时间:2015-07-01 01:25:26

标签: c++ c windows winapi kernel32

我在用户模式进程中运行以下代码段,当Windows用户帐户登录到工作站时启动。或者,换句话说,它的路径放在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run注册表项中。

代码应该确定我的用户进程的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的{​​{1}}或SECURITY_MANDATORY_MEDIUM_RID的{​​{1}},但如果我有一个Windows用户帐户已经登录,如果我随后切换用户,并使用其他用户帐户登录,则上面的方法将获得强制完整性级别的0x3000值。

有谁知道这个价值代表什么?

3 个答案:

答案 0 :(得分:5)

Windows Integrity Mechanism Design上的MSDN页面底部对其进行了描述:

  

RID以0x1000的间隔分隔,以便将来定义其他级别。分离还允许为略高于中等的流程分配完整性级别:例如,以满足特定的系统设计目标。

     

...

     

使用标准的UIAccess权限启动的应用程序   为用户分配了稍高的完整性级别值   访问令牌。 UIAccess的访问令牌完整性级别   标准用户的申请是中等诚信的价值   级别,加上0x10的增量。更高的完整性级别   UIAccess应用程序阻止同一桌面上的其他进程   打开UIAccess过程对象的中等完整性级别

答案 1 :(得分: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

答案 2 :(得分:0)

这是一个命名列表: Well-known SIDs

import React from "react";
import "./styles.css";
import Calendar from "react-calendar";

class App extends React.Component {
  state = {
    date: new Date(),
    classes: [
               { id: 1, name: "foo1" }, 
               { id: 2, name: "foo2" }
             ],
    displayClasses: false
  };

  onChange = date => this.setState({ date });
  displayClasses = () => {
    this.setState({ displayClasses: true });
  };
  render() {
    let classes = null;
    if (this.state.displayClasses) {
      classes = this.state.classes.map(cl => {
        return <li key={cl.id}>{cl.name}</li>;
      });
    }
    return (
      <div className="App">
        <Calendar
          onChange={this.onChange}
          value={this.state.date}
          onClickDay={this.displayClasses}
        />
        <br />
        <ul>{classes}</ul>
      </div>
    );
  }
}

export default App;

但是,如在其他答案中所述,两个列出的项目之间的值是有效的,并且如果必须命名它们,则应选择较低的值名称(例如511应该命名为| SID | Name | DEC | HEX | BIN | |-------------- |----------------------------------- |------- |------ |----------------: | | S-1-16-0 | Untrusted Mandatory Level | 0 | 0000 | 0 | | S-1-16-4096 | Low Mandatory Level | 512 | 0200 | 1000000000 | | S-1-16-8192 | Medium Mandatory Level | 8192 | 2000 | 10000000000000 | | S-1-16-8448 | Medium Plus Mandatory Level | 8448 | 2100 | 10000100000000 | | S-1-16-12288 | High Mandatory Level | 12288 | 3000 | 11000000000000 | | S-1-16-16384 | System Mandatory Level | 16384 | 4000 | 100000000000000 | | S-1-16-20480 | Protected Process Mandatory Level | 20480 | 5000 | 101000000000000 | | S-1-16-28672 | Secure Process Mandatory Level | 28672 | 7000 | 111000000000000 | 而不是{{1 }}。

进程只能与具有相同或更低完整性级别的系统对象进行交互。