Windows 设置字符串安全描述符以向提升的用户授予读取权限
我正在使用Windows 设置字符串安全描述符以向提升的用户授予读取权限,windows,winapi,Windows,Winapi,我正在使用convertstringsecuritydescriptor-securitydescriptor创建一个安全描述符,然后可以与CreateFile一起使用,因为它更容易阅读 我的目的是让文件完全由其所有者/创建者控制,并且只能由提升的进程读取 因此,我提出了以下SSDL字符串: SSDL := 'O:'+ SIDAsString + // owner is user 'D:' +
convertstringsecuritydescriptor-securitydescriptor
创建一个安全描述符,然后可以与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)';
sidaString
包含有效的SID
,例如S-1-5-18
convertstringsecuritydescriptor安全描述符
返回一个有效的安全描述符,并使用我期望的权限创建文件
但是,提升的进程(例如卸载程序)无法读取该文件,它们会收到拒绝访问错误。
如果尝试读取文件的进程通过以管理员身份运行
选项启动,它将按预期接收访问权限
我试着寻找提升的用户SID
,但我找不到任何关于它的提及,这让我相信没有这样的事情
除了向所有人授予读取权限外,是否有方法指定一个SSDL字符串,该字符串向以提升权限运行的进程授予读取权限
我试图寻找提升的用户SID
此SID是S-1-5-32-544
(Administrators
)。每个进程都有令牌,令牌包含哪个数组。对于启动提升或未提升的同一管理员用户-此阵列不同。(提升和未提升)管理员都有S-1-5-32-544
,但属性不同!提升的管理员启用了SE_GROUP_
,但没有提升(限制)的管理员启用
具有此属性的SID是仅拒绝的SID。当系统执行
访问检查,它检查应用于
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
因此,使用此DACL
非提升进程(如记事本)对系统
的所有访问以及对管理员
-文件的读取/执行都不能以只读方式打开。提升记事本时-可以打开并阅读。但不能写入或删除
注意:对于设置系统
作为所有者,我们需要SE\u RESTORE\u权限
您可以测试提升/未提升进程(如notepad.exe)如何打开此文件。提升不会更改用户的SID或组关联,只更改其令牌权限。同一用户可以运行提升和非提升进程。好的,您不能使用安全描述符根据提升状态授予/撤销访问权限。我认为你们需要仔细阅读海拔到底是什么以及它是如何工作的。也许阅读应用程序可以尝试为自己启用
SE\u BACKUP\u NAME
权限,然后在启用file\u FLAG\u BACKUP\u语义的情况下打开文件。这可能会授予您正在寻找的读取权限。@RemyLebeau-当进程在UAC下未提升运行时-他有管理员(S-1-5-32-544
),但具有SE\u GROUP\u USE\u for\u DENY\u
属性。当流程开始提升时-他有管理员(S-1-5-32-544
)启用了SE\u GROUP\u
-因此确实存在不同的组关联。如果我们只允许管理员访问(S-1-5-32-544
)-提升的进程将具有访问权限,但不会提升-否“但是,提升的进程无法读取文件”-vs“如果进程通过“以管理员身份运行”选项启动,它将按预期获得访问权限”-那么提升的进程是否可以读取文件?和(A;NP;FR;;LA)
或可能需要(A;NP;FRFX;;LA)
来启用对文件的执行访问?@RbMm:SE_组_使用_仅用于_拒绝
和SE组_启用
不是安全描述符可以引用的用户/组。它们只是控制如何将SID与安全描述符的ACE进行比较的令牌属性。因此,您仍然无法根据使用属性的用户/组的提升状态定制安全描述符以授予/拒绝访问。@RemyLebeau-“您不能使用安全描述符基于提升状态授予/撤销访问。”-这不是真的。举个简单的例子-c:\windows
文件夹-提升的用户可以创建/更改此文件夹中的文件,但不能提升。因为管理员
具有写入权限,但提升用户在令牌中没有此SID,但它仅用于Denny
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);
}
}