作为非管理员为何可以创建全局对象?一个深入的剖析
2024-03-26 10:26:10
作为非管理员创建全局对象:深入剖析
问题陈述
作为一名非管理员,我为何能够创建全局对象,即使没有获得明确的权限?
背景
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. 此问题有什么潜在的安全影响?
非管理员用户创建全局对象可能会绕过安全措施并导致系统不稳定。