返回

作为非管理员为何可以创建全局对象?一个深入的剖析

windows

作为非管理员创建全局对象:深入剖析

问题陈述

作为一名非管理员,我为何能够创建全局对象,即使没有获得明确的权限?

背景

Create Global Objects 权限通常只授予管理员和特定服务账户。因此,当一个普通用户尝试创建全局对象时,他们应该收到访问被拒绝的异常。然而,在某些情况下,非管理员用户却能够成功创建全局对象。

解决方案

理解这个问题的关键在于深入了解 Create Global Objects 权限的细微差别以及 Session 0 的作用:

1. 权限细微差别:

Create Global Objects 权限主要用于创建文件映射对象,而不是互斥量。

2. Session 0 的作用:

Session 0 是操作系统的一个特殊会话,拥有特殊的权限,包括创建全局对象的权限。即使当前用户没有 Create Global Objects 权限,Session 0 也可能拥有该权限,从而允许非管理员用户创建全局对象。

3. 排查步骤:

要进一步排查问题,可以执行以下步骤:

  • 检查系统事件跟踪 (ETW) 系统调用,以识别访问被拒绝的原因。
  • 尝试通过交互式登录而不是服务帐户创建全局对象,因为交互式登录可能会授予更高的权限。

示例代码

以下代码示例演示了如何创建全局互斥量,即使没有 Create Global Objects 权限:

using System.Security.AccessControl;
using System.Security.Principal;

class Program
{
    public static void Main(string[] args)
    {
        // 定义安全规则和互斥量安全
        MutexSecurity mutexSecurity = new MutexSecurity();
        mutexSecurity.AddAccessRule(new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow));

        // 创建互斥量
        bool createdNew;
        Mutex mutex = new Mutex(false, $"Global\\MyMutex{new Random().Next()}", out createdNew);

        // 授予每个人对互斥量的访问权限
        if (createdNew)
        {
            mutex.SetAccessControl(mutexSecurity);
        }

        Console.WriteLine("Waiting for work... Press Enter to exit.");
        Console.ReadLine();
        Console.WriteLine("Finished");
    }
}

结论

了解 Create Global Objects 权限的限制、Session 0 的作用以及交互式登录的影响,可以解决非管理员用户创建全局对象的问题。通过彻底的排查和示例代码,我们深入剖析了这个问题,提供了一种解决方案,帮助您避免潜在的安全漏洞。

常见问题解答

1. 什么是 Session 0?

Session 0 是操作系统的一个特殊会话,拥有超越普通用户会话的特殊权限。

2. 为什么 Create Global Objects 权限只适用于文件映射对象?

互斥量使用不同的底层机制进行创建,不需要 Create Global Objects 权限。

3. 如何排查访问被拒绝的异常?

检查系统事件跟踪 (ETW) 系统调用以查看拒绝访问的具体原因。

4. 如何通过交互式登录解决此问题?

交互式登录可能会授予更高的权限,允许非管理员用户创建全局对象。

5. 此问题有什么潜在的安全影响?

非管理员用户创建全局对象可能会绕过安全措施并导致系统不稳定。