SECURITY_ATTRIBUTES 实现最低权限总结

SECURITY_ATTRIBUTES 是 Windows 操作系统提供的一种机制,用于控制进程、线程、命名管道或文件等对象的安全性。通过设置相应的安全描述符,可以实现对这些对象的访问权限以及访问模式等进行控制。

此外,SECURITY_ATTRIBUTES 还可以应用于创建具备最低权限的进程或线程。通过设置安全描述符中的 DACL (Discretionary Access Control List,自主访问控制列表)以及 SACL (System Access Control List,系统访问控制列表),可以有效地限制程序中所使用的资源的权限。

下面是基于 SECURITY_ATTRIBUTES 实现最低权限的一些常见做法:

1. 通过创建低权限用户实现:

针对拥有 Windows 安全性模型的应用,可以通过创建较低权限的用户,将指定进程或线程的安全描述符作为这个用户的安全描述符来创建。在此情况下,创建的进程仅能使用用户权限所允许的操作和资源。如果需要更高级别的操作和资源,则需要在安全描述符中为该用户明确授权。

例如,使用 C# 实现最低权限进程创建:

```

System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();

psi.UserName = "LowLevelUser";

psi.Password = new System.Security.SecureString();

foreach (char c in password.ToCharArray())

psi.Password.AppendChar(c);

psi.UseShellExecute = false;

psi.FileName = "LowLevelProgram.exe";

psi.LoadUserProfile = true;

var process = System.Diagnostics.Process.Start(psi);

```

在此代码片段中,我们将创建一个名为“LowLevelUser”的用户,并通过将密码存储在“SecureString”中来设置此用户的密码。进程启动器 (psi) 会在这个用户的上下文中启动一个名为“LowLevelProgram.exe”的程序,这将授予程序最小的权限。

2. 通过修改现有安全性描述符实现:

使用现有安全性描述符来创建较低权限的进程或线程,这会直接影响被赋予权限的操作和资源。例如,如果将操作系统的附加 Service Pack 或补丁程序应用到安全描述符中,则会限制可访问的操作和资源。

例如,可以采用以下过程来创建较低权限进程:

① 创建一个默认访问控制列表:

```

var security = new Interop.SECURITY_ATTRIBUTES();

security.nLength = Marshal.SizeOf(security);

security.bInheritHandle = true;

Interop.CreateATLWithDefaultDacl(ref security);

```

这里我们首先创建一个名为“security”的 SECURITY_ATTRIBUTES 实例,然后设置其 bInheritHandle 属性为 true。接着,通过调用 CreateATLWithDefaultDacl 来创建一个默认的访问控制列表 (DACL),该列表中包含一个 ACE (访问控制条目) ,用于授予指定的安全标识符 (SID) 使用对象的权限。

② 执行进程:

```

var psi = new System.Diagnostics.ProcessStartInfo();

psi.FileName = "C:\\Windows\\system32\\notepad.exe";

IntPtr hProcess = default, hThread = default;

if (!Interop.CreateProcessWithTokenW(

hToken,

dwLogonFlags,

psi.FileName,

IntPtr.Zero,

dwCreationFlags,

IntPtr.Zero,

psi.WorkingDirectory,

ref startupInfo,

out processInformation,

out hProcess,

out hThread,

ref security))

{

throw new System.ComponentModel.Win32Exception();

}

```

在此代码片段中,我们基于 "security" 实例的 DACL 来创建一个新的进程。在 Interop.CreateProcessWithTokenW 方法中,我们需要传入一个名为 "security" 的 SECURITY_ATTRIBUTES 实例,以便创建一个具有最低权限的进程。

3. 通过使用安全标识符来实现:

在 Windows 操作系统中,每个用户都有一个独特的安全标识符 (SID),它可以用于创建较低权限的进程。通过设置安全描述符的 DACL,可以在创建进程时将其限制为具备最低权限。

例如,以下代码片段展示了如何创建一个具备最低权限的进程:

```

var token = default(IntPtr);

if (!Interop.LogonUserW(

userName,

domainName,

password,

Interop.LOGON32_LOGON_INTERACTIVE,

Interop.LOGON32_PROVIDER_DEFAULT,

out token))

{

throw new System.ComponentModel.Win32Exception();

}

var sid = new SecurityIdentifier(sidByteArray, 0);

var dacl = new DiscretionaryAcl(false, false, 1);

dacl.AddAccess(

AccessControlType.Allow,

sid,

GENERIC_READ,

InheritanceFlags.None,

PropagationFlags.None);

var security = new Interop.SECURITY_ATTRIBUTES();

security.nLength = Marshal.SizeOf(security);

security.bInheritHandle = true;

security.lpSecurityDescriptor = new RawSecurityDescriptor(

ControlFlags.None,

null,

null,

dacl,

null);

```

在此代码片段中,我们使用 LogonUser 函数来获取指定用户的令牌。接着,我们使用提供的 SID 和 DACL 信息创建一个新的 SECURITY_ATTRIBUTES 实例。在此过程中,我们需要使用 SecurityIdentifier 类型来创建一个具备最低权限的访问控制列表 (ACL)。

以上仅是一些基于 SECURITY_ATTRIBUTES 实现最低权限的常见做法,具体实现方式还会因所使用的编程语言、操作系统版本和环境等因素而略有差异。此外,为了确保功能的正确性和安全性,在应用 SECURITY_ATTRIBUTES 时,还应当了解相关安全概念和技术,如 Access Control Model 和 Windows 安全性架构等。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(44) 打赏

评论列表 共有 1 条评论

柳淡烟 1年前 回复TA

不期待突如其来的好运只希望所有的努力终有回报。再努力奋斗若干年过上自己想要的惬意生活。愿你所有快乐无需假装愿有人陪你一起颠沛流离陪你看细水常流的风景。

立即
投稿
发表
评论
返回
顶部