设置字符串安全描述符以提供对提升用户的读访问权限

时间:2016-11-29 16:32:42

标签: windows winapi

我正在使用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字符串,该字符串为使用提升权限运行的进程提供读访问权?

1 个答案:

答案 0 :(得分:0)

  

我尝试寻找提升的用户SID

此SID为S-1-5-32-544Administrators)。每个进程都有令牌,令牌包含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-544Administrators)进行适当的访问(并且对system也是如此) - 结果提升了进程如果没有提升,将有权访问文件 - 没有。

演示:我们在DACL规则中创建具有下一次访问权限的SD:

001F01FF S-1-5-18 SYSTEM
001200A9 S-1-5-32-544 Administrators

所以对SYSTEMAdministrators的读取/执行的所有访问 - 具有此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)如何打开此文件。