go 建议:x/sys/windows:允许在SysProcAttr中指定安全功能

smtd7mpg  于 6个月前  发布在  Go
关注(0)|答案(4)|浏览(56)

提案详情

在Windows上允许添加 Security CapabilitiesSysProcAttr。请注意,这与现有的 SecurityAttributes 结构体不同,该结构体可以设置为 ProcessAttributesThreadAttributes 字段。

动机

最近,作为沙箱子进程工作的一部分,HashiCorp 的 Nomad 团队需要为一个进程添加一个 SECURITY_CAPABILITIES 结构体到 StartupInfoEx。因为这在 SysProcAttr 中没有暴露,所以涉及到编写大量的代码,其中很多必须简单地从 os/exec 标准库中复制。参见 helper/winexec/create.go

实现注意事项

之前有一个提案是将 ParentProcess 字段添加到 Windows #44011SysProcAttr 中。这个提议和一个被拒绝的提案一起讨论,该提案是将完整的 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.goStartupInfoEx 创建适当的属性,就像我们已经为父句柄等创建的那样。

z3yyvxxp

z3yyvxxp2#

感谢您提交此提案。我认为支持安全功能将是一个很好的补充。
一些评论:
#44005 中的关注点是用户设置的属性可能与 syscall.StartProcess 设置的参数和属性冲突,有些冲突可能无法调和。结论是我们希望管理哪些属性可以被用户设置,以便 syscall.StartProcess 始终保持一致。这放弃了选项1。
另一种选择是在 SysProcAttr 中添加一个 SecurityCapabilities 字段,
这似乎是正确的方法。所有新的类型和属性应该在 syscall 包中定义,而不是在 x/sys/windows 中,因为这是 os/exec 底层使用的。我已经稍微修改了您提出的 API,以更好地适应 syscall:

package syscall

type SecurityCapabilities struct {
	AppContainerSid *SID
	Capabilities    *SIDAndAttributes
	CapabilityCount uint32
	Reserved        uint32
}

type SysProcAttr struct {
	...
	SecurityCapabilities       *SecurityCapabilities // if set, applies these security capabilities to the new process
}
mlnl4t2r

mlnl4t2r3#

对我来说是有意义的!我应该在原始提案中指出,我/我们很高兴为此补丁做出贡献。在此情况下下一步是什么?我们应该按照上述方式提交补丁还是提交设计文档?

bxgwgixi

bxgwgixi4#

对我来说是有意义的!我应该在原始提案中指出,我/我们很高兴为此补丁做出贡献。在这个阶段下一步是什么?我们应该按照上述方式提交补丁还是提交设计文档?

我们需要等待该提案被提案委员会讨论,参见提案流程。没有必要提交设计文档,更改已经足够简单了。我建议等到提案获得批准后再提交你的补丁。

相关问题