提案详情
在Windows上允许添加 Security Capabilities 到 SysProcAttr
。请注意,这与现有的 SecurityAttributes
结构体不同,该结构体可以设置为 ProcessAttributes
或 ThreadAttributes
字段。
动机
最近,作为沙箱子进程工作的一部分,HashiCorp 的 Nomad 团队需要为一个进程添加一个 SECURITY_CAPABILITIES
结构体到 StartupInfoEx
。因为这在 SysProcAttr
中没有暴露,所以涉及到编写大量的代码,其中很多必须简单地从 os/exec
标准库中复制。参见 helper/winexec/create.go
实现注意事项
之前有一个提案是将 ParentProcess
字段添加到 Windows #44011 的 SysProcAttr
中。这个提议和一个被拒绝的提案一起讨论,该提案是将完整的 StartupInfoEx
结构体 #44005 添加进来。
拒绝 StartupInfoEx
提案的一个原因是,它导致了如何将用户提供的默认属性与任何默认属性合并的模糊性。有两种方法可以解决这个问题:
选项1:可扩展
我们上面的实现引用了向分叉的 os/exec.Cmd
添加一个 ProcThreadAttributes
字段,该字段是 ProcThreadAttribute
的切片。相反,可以将此添加到 SysProcAttr
作为扩展方式以添加更多属性:
type SysProcAttr struct {
// ...
ProcThreadAttributes []ProcThreadAttribute
}
type ProcThreadAttribute struct {
Attribute uintptr
Value unsafe.Pointer
Size uintptr
}
当构建 StartupInfoEx
结构体时,我们调用 newProcThreadAttributeList
并传入 len(ProcThreadAttributes) + 2
(使用 syscall/exec_windows.go
中的默认属性)。如果使用相同的 Attribute
字段,来自用户的任何 ProcThreadAttributes
都会覆盖这些默认值,从而产生明确的行为。
选项2:仅安全属性
另一种选择是在 SysProcAttr
和
type SysProcAttr struct {
// ...
SecurityCapabilities SecurityCapabilities
}
type SecurityCapabilities struct {
AppContainerSid uintptr // PSID *windows.SID
Capabilities uintptr // SID_AND_ATTRIBUTES *windows.SIDAndAttributes
CapabilityCount uint32
Reserved uint32
}
中添加一个 SecurityCapabilities
字段。然后由 syscall/exec_windows.go
为 StartupInfoEx
创建适当的属性,就像我们已经为父句柄等创建的那样。
4条答案
按热度按时间gwo2fgha1#
CC @golang/windows
z3yyvxxp2#
感谢您提交此提案。我认为支持安全功能将是一个很好的补充。
一些评论:
#44005 中的关注点是用户设置的属性可能与
syscall.StartProcess
设置的参数和属性冲突,有些冲突可能无法调和。结论是我们希望管理哪些属性可以被用户设置,以便syscall.StartProcess
始终保持一致。这放弃了选项1。另一种选择是在 SysProcAttr 中添加一个 SecurityCapabilities 字段,
这似乎是正确的方法。所有新的类型和属性应该在
syscall
包中定义,而不是在x/sys/windows
中,因为这是os/exec
底层使用的。我已经稍微修改了您提出的 API,以更好地适应syscall
:mlnl4t2r3#
对我来说是有意义的!我应该在原始提案中指出,我/我们很高兴为此补丁做出贡献。在此情况下下一步是什么?我们应该按照上述方式提交补丁还是提交设计文档?
bxgwgixi4#
对我来说是有意义的!我应该在原始提案中指出,我/我们很高兴为此补丁做出贡献。在这个阶段下一步是什么?我们应该按照上述方式提交补丁还是提交设计文档?
我们需要等待该提案被提案委员会讨论,参见提案流程。没有必要提交设计文档,更改已经足够简单了。我建议等到提案获得批准后再提交你的补丁。