具有不受信任的完整性级别的Windows进程

时间:2017-05-17 14:38:10

标签: windows security winapi uac windows-security

我无法在Windows中找到有关不受信任的完整性级别的大量信息,并对此有一些疑问:

  1. 是否存在不受信任的完整性级别进程可以创建命名对象的位置? (互斥,事件等)。
  2. 不受信任的完整性级别进程是否能够打开现有的命名对象,在canvas.on('selection:cleared',function(e){/**Put ur code here...*/}); ACESYSTEM_MANDATORY_LABEL_NO_WRITE_UP MandatoryLevelUntrusted的创建时间内给出了安全描述符?当我尝试时,它会因0xc0000022(访问被拒绝)而失败,而使用MandatoryLevelLow则效果很好。
  3. 通常不受信任的完整性流程如何与其代理流程进行通信? (例如Google Chrome标签如何与Google Chrome代理进行通信?)

1 个答案:

答案 0 :(得分:2)

  

是否存在不受信任的完整性级别进程可以创建的位置   命名对象? (互斥,事件等)。

默认情况下 - 没有。具有不受信任的令牌(线程或进程)的代码只能在Untrusted Mandatory Level的目录中创建对象 - 没有一个标准文件夹具有这种标签。有些人Low Mandatory Level但不信任 - 不。

但您可以自己轻松创建此文件夹。使用Untrusted Mandatory LevelNULL DACL - 不受信任的代码可以在此文件夹中创建对象。

NTSTATUS CreateUntrustedFolder(PHANDLE phObject, PCUNICODE_STRING ObjectName)
{
    ULONG cb = MAX_SID_SIZE;
    PSID UntrustedSid = (PSID)alloca(MAX_SID_SIZE);
    if (CreateWellKnownSid(WinUntrustedLabelSid, 0, UntrustedSid, &cb))
    {
        PACL Sacl = (PACL)alloca(cb += sizeof(ACL) + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));
        InitializeAcl(Sacl, cb, ACL_REVISION);
        if (AddMandatoryAce(Sacl, ACL_REVISION, 0, 0, UntrustedSid))
        {
            SECURITY_DESCRIPTOR sd;
            InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
            SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
            SetSecurityDescriptorSacl(&sd, TRUE, Sacl, FALSE);

            OBJECT_ATTRIBUTES oa = { sizeof(oa), 0, (PUNICODE_STRING)ObjectName, OBJ_CASE_INSENSITIVE|OBJ_OPENIF, &sd };

            return ZwCreateDirectoryObject(phObject, DIRECTORY_ALL_ACCESS, &oa);
        }
    }

    return STATUS_UNSUCCESSFUL;
}

关于不受信任的代码创建 - 如果开始时将标记为不可信完整性级别的标记启动 - 进程无法启动。当 ntdll.dll 尝试加载 kernel32.dll 时,它会尝试使用\KnownDlls\kernel32.dll打开SECTION_MAP_WRITE部分,但此对象有{{1与Low Mandatory Level - 因此不受信任的代码失败打开此部分具有写访问权限。

因此,您最初需要使用SYSTEM_MANDATORY_LABEL_NO_WRITE_UP创建流程,然后设置不受信任的级别

Low Mandatory Level
  

不受信任的完整性级别进程是否能够打开现有的   命名对象

这取决于对象标签(级别和掩码),代码完整性级别和所需访问。如果代码完整性级别> =对象标签级别 - 我们可以打开对象(如果 dacl 让这样做)。否则需要寻找对象标签掩码和所需的访问权限。例如,对象具有ULONG SetProcessUntrusted(HANDLE hProcess) { TOKEN_MANDATORY_LABEL tml = { { (PSID)alloca(MAX_SID_SIZE), SE_GROUP_INTEGRITY } }; ULONG cb = MAX_SID_SIZE; HANDLE hToken; if (!CreateWellKnownSid(WinUntrustedLabelSid, 0, tml.Label.Sid, &cb) || !OpenProcessToken(hProcess, TOKEN_ADJUST_DEFAULT, &hToken)) { return GetLastError(); } ULONG dwError = NOERROR; if (!SetTokenInformation(hToken, TokenIntegrityLevel, &tml, sizeof(tml))) { dwError = GetLastError(); } CloseHandle(hToken); return dwError; } Low Mandatory Level和代码SYSTEM_MANDATORY_LABEL_NO_WRITE_UP - 此代码可以打开具有读取和执行访问权限的对象,但无法打开它以进行写入访问