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

标签 windows security winapi uac windows-security

我找不到很多关于 Windows 中不受信任的完整性级别的信息,对此有一些疑问:

  1. 是否有不受信任的完整性级别进程可以创建命名对象的地方? (互斥锁、事件等)
  2. 不受信任的完整性级别进程是否应该能够打开一个现有的命名对象,该对象在其创建时通过 ACESYSTEM_MANDATORY_LABEL_NO_WRITE_UP 被赋予安全描述符到 MandatoryLevelUntrusted ?当我尝试时,它失败并显示 0xc0000022(访问被拒绝),而使用 MandatoryLevelLow 时效果很好。
  3. 通常不受信任的完整性进程如何与其代理进程通信? (比如 google chrome 标签如何与 google chrome 代理通信?)

最佳答案

Is there a place where an untrusted integrity level process can create named objects? (mutexes, events, etc..)

默认情况下 - 没有。具有不受信任 token (线程或进程)的代码只能在具有 Untrusted 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;
}

关于不受信任的代码创建 - 如果在开始时使用标记为不受信任的完整性级别的 token 启动进程 - 进程无法启动。当 ntdll.dll 尝试加载 kernel32.dll - 它尝试使用 SECTION_MAP_WRITE 打开部分 \KnownDlls\kernel32.dll > 同样,但此对象具有 Low Mandatory LevelSYSTEM_MANDATORY_LABEL_NO_WRITE_UP - 因此不受信任的代码无法打开具有写入权限的此部分。

因此,您首先需要使用 Low Mandatory Level 创建进程,然后设置不受信任的级别

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

Should untrusted integrity level process be able to open an existing named object

这取决于对象标签(级别和掩码)、代码完整性级别和所需的访问权限。如果代码完整性级别 >= 对象标签级别 - 我们可以打开对象(如果 dacl 让我们这样做)。否则需要查找对象标签掩码和所需的访问权限。例如对象具有 Low Mandatory Level with SYSTEM_MANDATORY_LABEL_NO_WRITE_UP 和代码 Untrusted Mandatory Level - 此代码可以打开具有读取和执行访问权限的对象,但无法打开它用于写访问

关于具有不受信任完整性级别的 Windows 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44027935/

相关文章:

windows - Windows XP 中用于复制粘贴文件夹的 .bat 文件

windows - Windows 8下读取物理内存

java - Axis2 Web 服务 SSL 通信

c++ - std::function 方法引用无法将 DWORD 转换为 DWORD64?

c++ - 创建虚拟分区

linux - Windows 和 Linux 之间的 git status 不一致

security - 当前用户是LocalSystem 检查?

python - 我的代码会阻止目录遍历吗?

c++ - 如何使用 WriteFile 写入 stderr

windows - 当不知道 InterfaceClassGUID 时,我可以使用 SetupDiEnumDeviceInterfaces 从 SetupDiGetDeviceInterfaceDetail 获取 DevicePath 吗?