Windows 具有不受信任完整性级别的进程
Windows process with Untrusted Integrity level
我在 Windows 中找不到很多关于不受信任的完整性级别的信息,对此有一些疑问:
- 是否有不受信任的完整性级别进程可以创建命名对象的地方? (互斥锁、事件等)
- 不受信任的完整性级别进程是否应该能够打开一个现有的命名对象,该对象在其创建时被赋予了一个安全描述符
ACE
,SYSTEM_MANDATORY_LABEL_NO_WRITE_UP
到 MandatoryLevelUntrusted
?当我尝试它时,它失败并显示 0xc0000022
(访问被拒绝),而使用 MandatoryLevelLow
效果很好。
- 通常不受信任的完整性进程如何与其代理进程通信? (比如 google chrome 选项卡如何与 google chrome 代理通信?)
Is there a place where an untrusted integrity level process can create
named objects? (mutexes, events, etc..)
默认情况下 - 没有。具有不受信任令牌(线程或进程)的代码只能在具有 Untrusted Mandatory Level
的目录中创建对象 - 没有一个标准文件夹具有这种标签。有些有 Low Mandatory Level
但不受信任 - 没有。
但您可以轻松地自己创建此文件夹。使用 Untrusted Mandatory Level
和 NULL
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
也,但是此对象具有 Low Mandatory Level
和 SYSTEM_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
和 SYSTEM_MANDATORY_LABEL_NO_WRITE_UP
和代码 Untrusted Mandatory Level
- 此代码可以打开具有读取和执行访问权限的对象,但无法打开它进行写入访问
我在 Windows 中找不到很多关于不受信任的完整性级别的信息,对此有一些疑问:
- 是否有不受信任的完整性级别进程可以创建命名对象的地方? (互斥锁、事件等)
- 不受信任的完整性级别进程是否应该能够打开一个现有的命名对象,该对象在其创建时被赋予了一个安全描述符
ACE
,SYSTEM_MANDATORY_LABEL_NO_WRITE_UP
到MandatoryLevelUntrusted
?当我尝试它时,它失败并显示0xc0000022
(访问被拒绝),而使用MandatoryLevelLow
效果很好。 - 通常不受信任的完整性进程如何与其代理进程通信? (比如 google chrome 选项卡如何与 google chrome 代理通信?)
Is there a place where an untrusted integrity level process can create named objects? (mutexes, events, etc..)
默认情况下 - 没有。具有不受信任令牌(线程或进程)的代码只能在具有 Untrusted Mandatory Level
的目录中创建对象 - 没有一个标准文件夹具有这种标签。有些有 Low Mandatory Level
但不受信任 - 没有。
但您可以轻松地自己创建此文件夹。使用 Untrusted Mandatory Level
和 NULL
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
也,但是此对象具有 Low Mandatory Level
和 SYSTEM_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
和 SYSTEM_MANDATORY_LABEL_NO_WRITE_UP
和代码 Untrusted Mandatory Level
- 此代码可以打开具有读取和执行访问权限的对象,但无法打开它进行写入访问