在新用户命名空间中使用凭据的 exec.Command 出现错误:“不允许操作”

我想使用 Linux 命名空间和 Go 来执行命令来实现一个简单的沙箱。为了防止该命令写入磁盘,该命令以另一个用户身份使用 执行Credential: &syscall.Credential{Uid: uint32(1), Gid: uint32(1)}

但是,我收到此错误:“fork/exec /Main:不允许操作”。

即使我将代码更改为Credential: &syscall.Credential{Uid: uint32(0), Gid: uint32(0)},也会发生相同的错误。

当我运行时sudo ./container -command='/Main' -username='nobody',出现错误“fork/exec /Main:不允许操作”。

的用户命名空间中的用户justiceInit应该是root,但不能使用 来设置uid和gid Credential

我是linux和命名空间的新手。也许我误解了什么。我应该如何修复这个错误?非常感谢!


慕标5832272
浏览 118回答 1
1回答

aluckdog

我追踪了源代码cmd.Run(),发现:type SysProcAttr struct {    UidMappings  []SysProcIDMap // User ID mappings for user namespaces.    GidMappings  []SysProcIDMap // Group ID mappings for user namespaces.    // GidMappingsEnableSetgroups enabling setgroups syscall.    // If false, then setgroups syscall will be disabled for the child process.    // This parameter is no-op if GidMappings == nil. Otherwise for unprivileged    // users this should be set to false for mappings work.    GidMappingsEnableSetgroups bool}因此,如果 的值为默认GidMappingsEnableSetgroups值false,则无论子进程是否具有 root 权限,justiceInit都没有权限使用syscall。setgroups结果,当我在函数中cmd.SysProcAttr.GidMappingsEnableSetgroups设置如下时,它就起作用了!truemaincmd.Stdin = os.Stdincmd.Stdout = os.Stdoutcmd.Stderr = os.Stderrcmd.SysProcAttr = &syscall.SysProcAttr{    // ...    GidMappingsEnableSetgroups: true,}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go