【问题标题】:non-default access to an elevated process from a non-elevated process从非提升进程对提升进程的非默认访问
【发布时间】:2017-11-13 18:54:37
【问题描述】:

抱歉英语不好

通过在进程资源管理器中更改提升的进程安全描述符,当它们都具有相同的登录会话 ID 时,非提升的进程是否有可能获得对提升的进程的非默认访问权限(例如 PROCESS_QUERY_INFORMATION)安全标签? 我尝试更改提升进程的安全描述符并为登录会话 SID 选择了完全访问权限。但当我使用 PROCESS_QUERY_INFORMATION 访问权限调用 OpenProcess() 时仍处于非提升进程中,它返回 ERROR_ACCESS_DENIED

【问题讨论】:

  • 看来,如果可能的话,这将是一个巨大的安全漏洞。
  • 我使用提升的进程资源管理器来更改安全描述符,为什么不可能?
  • 当然这是可能的。但是您忘记了强制性标签。您需要将其设置为中或低(不受信任)级别以提升进程。在此之后,您可以从非高架打开它。如果您的非提升过程具有中等完整性级别 - 您需要在提升的 sd 中设置为中或低
  • @RbMm 我将提升进程的完整性级别更改为中等(与非提升进程相同),但仍然无法 OpenProcess()
  • @shbruzu - 我个人可以。需要查找您提升的进程 SD 而不是提升的令牌

标签: c++ windows winapi


【解决方案1】:

从 vista 开始也存在 Mandatory Integrity Control。提升的进程具有带有 SYSTEM_MANDATORY_LABEL_NO_WRITE_UPSYSTEM_MANDATORY_LABEL_NO_READ_UP 掩码的高强制标签 (S-1-16-12288)。从另一个方面来看,未提升的进程在令牌中具有中等强制级别 (S-1-16-8192)。因此,当它尝试使用 PROCESS_QUERY_INFORMATION 打开进程时,它是进程对象的通用读取的一部分 - 我们通常无法从非提升进程(中级)执行此操作以获取提升进程(高标签和 SYSTEM_MANDATORY_LABEL_NO_READ_UP)。

对于让PROCESS_QUERY_INFORMATION 提升的进程从未提升的打开 - 我们需要更改提升的进程强制标签。或将其设置为中或低,或删除SYSTEM_MANDATORY_LABEL_NO_READ_UP 标志。最后一个选项 - 最适合我的外观

对于删除SYSTEM_MANDATORY_LABEL_NO_READ_UP,我们可以使用下一个代码:

// hProcess must have READ_CONTROL | WRITE_OWNER 
ULONG RemoveNoReadUp(HANDLE hProcess = NtCurrentProcess())
{
    union {
        PVOID buf;
        PSECURITY_DESCRIPTOR pSD;
    };

    ULONG cb = 0, rcb = 128;

    static volatile UCHAR guz = 0;
    PVOID stack = alloca(guz);

    ULONG err;
    do 
    {
        if (cb < rcb)
        {
            cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
        }

        if (GetKernelObjectSecurity(hProcess, LABEL_SECURITY_INFORMATION, pSD, cb, &rcb))
        {
            BOOL bPresent, bDefault;
            PACL Acl;

            if (!GetSecurityDescriptorSacl(pSD, &bPresent, &Acl, &bDefault))
            {
                return GetLastError();
            }

            if (bPresent)
            {
                if (DWORD AceCount = Acl->AceCount)
                {
                    union {
                        PVOID pv;
                        PBYTE pb;
                        PACE_HEADER pAH;
                        PSYSTEM_MANDATORY_LABEL_ACE pMLA;
                    };

                    pv = Acl + 1;
                    do 
                    {
                        if (pAH->AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE)
                        {
                            if (pMLA->Mask & SYSTEM_MANDATORY_LABEL_NO_READ_UP)
                            {
                                pMLA->Mask &= ~SYSTEM_MANDATORY_LABEL_NO_READ_UP;

                                return SetKernelObjectSecurity(hProcess, LABEL_SECURITY_INFORMATION, pSD) 
                                    ? NOERROR : GetLastError();
                            }
                        }
                    } while (pb += pAH->AceSize, --AceCount);
                }
            }
            return ERROR_NOT_FOUND;
        }

    } while ((err = GetLastError()) == ERROR_INSUFFICIENT_BUFFER);

    return err;
}

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 2014-08-20
    • 2014-04-30
    • 1970-01-01
    • 2015-07-20
    • 2011-01-31
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多