【问题标题】:What does mandatory integrity level value of 0x2010 stand for?0x2010 的强制完整性级别值代表什么?
【发布时间】:2015-07-01 01:25:25
【问题描述】:

我正在我的用户模式进程中运行以下 sn-p 代码,该进程在 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 的值(对于SECURITY_MANDATORY_MEDIUM_RID,或0x3000 对于SECURITY_MANDATORY_HIGH_RID,但是如果我有一个Windows 用户帐户已经登录,并且如果我然后切换用户,并使用另一个用户帐户登录,上面的方法会得到0x2010 的值作为强制完整性级别。

有人知道这个值代表什么吗?

【问题讨论】:

    标签: c++ c windows winapi kernel32


    【解决方案1】:

    Windows Integrity Mechanism Design 的 MSDN 页面底部有描述:

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

    ...

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

    【讨论】:

    • 哦,我明白了。欣赏它。我想我错过了那部分。
    【解决方案2】:

    您没有考虑完整性级别使用值范围,其中可以为令牌/进程分配一个值范围内的值,以用于其完整性级别。您只是在寻找特定的值。

    不受信任的完整性可以是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

    表 2 定义的完整性等级和对应值 值 描述 符号 0x0000 不受信任的级别 SECURITY_MANDATORY_UNTRUSTED_RID 0x1000 低完整性级别 SECURITY_MANDATORY_LOW_RID 0x2000 中等完整性级别 SECURITY_MANDATORY_MEDIUM_RID 0x3000 高完整性级别 SECURITY_MANDATORY_HIGH_RID 0x4000 系统完整性级别 SECURITY_MANDATORY_SYSTEM_RID

    【讨论】:

    • 嗯。有趣的。谢谢。我不知道这些级别可能是介于两者之间的任意值。所以假设,我可以使用0x2123 的 MIL 运行我的用户进程,对吗?
    • @c00000fd 没错。它们只是任意值——它们只有在与其他进程的 IL 进行比较时才有意义。
    • @JonathanPotter:好的。谢谢你俩。我今天刚学到新东西!
    【解决方案3】:

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

    | 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   |
    

    但是,正如在其他答案中所说,两个列出的项目之间的值是有效的,如果你必须命名它们,你应该选择较低的值名称,(例如 511 应该命名为 untrusted plus 而不是 Low Mandatory)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 2011-11-07
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多