我正在使用ConvertStringSecurityDescriptorToSecurityDescriptor
创建一个安全描述符,然后我可以将其与CreateFile
一起使用,因为它更容易,更易读。
我的意图是文件可由其所有者/创建者完全控制,并且只能由提升的进程读取。
因此我提出了以下SSDL字符串:
SSDL :=
'O:'+ SIDAsString + // owner is user
'D:' + // Discretionary ACL
'P' + // protected
'(A;NP;FA;;;' + SIDAsString + ')' + // Full control to owner
// Read only access to administrators
'(A;NP;FR;;;LA)' +
'(A;NP;FR;;;BA)';
SIDAsString
包含有效的SID
,例如S-1-5-18
。
ConvertStringSecurityDescriptorToSecurityDescriptor
返回一个有效的安全描述符,并使用我期望的权限创建文件。
但是,提升的进程(例如卸载程序)无法读取文件,它们会收到拒绝访问错误。
如果尝试读取文件的进程是通过run as administrator
选项启动的,则它会按预期接收访问权限。
我尝试寻找提升用户SID
,但我找不到任何提及,这让我相信没有这样的事情。
如果没有给每个人提供读取权限,是否有办法指定一个SSDL字符串,该字符串为使用提升权限运行的进程提供读访问权?
答案 0 :(得分:0)
我尝试寻找提升的用户SID
此SID为S-1-5-32-544
(Administrators
)。每个进程都有令牌,令牌包含TOKEN_GROUPS
,其中包含SID_AND_ATTRIBUTES
数组。对于相同的管理员用户,当它开始提升或未提升时 - 此数组是不同的。两个(提升的和未提升的)管理员都有S-1-5-32-544
但具有不同的属性!提升管理员使用SE_GROUP_ENABLED
但不提升(限制)管理员SE_GROUP_USE_FOR_DENY_ONLY
具有此属性的SID是仅拒绝SID。当系统执行时 访问检查,它检查适用于访问被拒绝的ACE SID,但它忽略了SID允许访问的ACE。
所以这是关键点 - 我们需要使用DACL创建SD,我们只允许对S-1-5-32-544
(Administrators
)进行适当的访问(并且对system
也是如此) - 结果提升了进程如果没有提升,将有权访问文件 - 没有。
演示:我们在DACL
规则中创建具有下一次访问权限的SD:
001F01FF S-1-5-18 SYSTEM
001200A9 S-1-5-32-544 Administrators
所以对SYSTEM
和Administrators
的读取/执行的所有访问 - 具有此DACL
未提升的进程(例如记事本)的文件甚至无法以只读方式打开。升高的记事本 - 可以打开和阅读。但不能写或删除
注意:对于设置为SYSTEM
的所有者,我们需要SE_RESTORE_PRIVILEGE
void TestX()
{
SECURITY_ATTRIBUTES sa = { sizeof(sa) };
if (ConvertStringSecurityDescriptorToSecurityDescriptor(
L"O:SYD:P(A;NP;FA;;;SY)(A;NP;FRFX;;;BA)",
SDDL_REVISION_1, &sa.lpSecurityDescriptor, 0))
{
HANDLE hToken;
if (OpenProcessToken(NtCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
static ::TOKEN_PRIVILEGES tp = {
1, { { { SE_RESTORE_PRIVILEGE }, SE_PRIVILEGE_ENABLED|SE_PRIVILEGE_ENABLED_BY_DEFAULT } }
};
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), 0, 0);
CloseHandle(hToken);
}
HANDLE hFile = CreateFile(L"c:\\windows\\1.txt", FILE_GENERIC_WRITE, 0, &sa, CREATE_NEW, 0, 0);
if (hFile != INVALID_HANDLE_VALUE)
{
ULONG cb;
WriteFile(hFile, "1234567890", 10, &cb, 0);
CloseHandle(hFile);
}
LocalFree(sa.lpSecurityDescriptor);
}
}
您可以测试提升/未提升的进程(例如notepad.exe)如何打开此文件。