我在Windows中找不到太多关于不受信任的完整性级别的信息,并且对此有一些疑问:
- 不受信任的完整性级别进程是否可以在某个位置创建命名对象?(互斥体、事件等)
- 不受信任的完整性级别进程是否应该能够打开现有的命名对象,该对象在创建时被赋予了安全描述符,
ACE
具有SYSTEM_MANDATORY_LABEL_NO_WRITE_UP
MandatoryLevelUntrusted
?当我尝试它时,它因0xc0000022
(访问被拒绝)而失败,而MandatoryLevelLow
它工作得很好。 - 通常不受信任的完整性进程如何与其代理进程通信?(比如谷歌浏览器标签如何与谷歌浏览器经纪人通信?)
信任的完整性级别进程可以创建的位置 命名对象?(互斥体、事件等)
具有不受信任令牌(线程或进程)的代码只能在具有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尝试加载内核32.dll- 它也尝试使用SECTION_MAP_WRITE
打开部分KnownDllskernel32.dll
,但此对象具有SYSTEM_MANDATORY_LABEL_NO_WRITE_UP
Low Mandatory Level
- 结果不受信任的代码失败 使用写入访问权限打开此部分。
因此,您需要首先创建进程,例如使用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;
}
不受信任的完整性级别进程是否能够打开现有的 命名对象
这取决于对象标签(级别和掩码)、代码完整性级别和所需的访问权限。 如果代码集成级别>= 对象标签级别 - 我们可以打开对象(如果DACL允许这样做)。 否则需要查找对象标签掩码和所需的访问权限。 例如,对象具有SYSTEM_MANDATORY_LABEL_NO_WRITE_UP
和代码Untrusted Mandatory Level
Low Mandatory Level
- 此代码可以打开具有读取和执行访问权限的对象, 但无法打开它以进行写入访问