为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕标5832272 2023-07-26 17:13:03
我想使用 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和命名空间的新手。也许我误解了什么。我应该如何修复这个错误?非常感谢!
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

我追踪了源代码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设置如下时,它就起作用了!truemain


cmd.Stdin = os.Stdin

cmd.Stdout = os.Stdout

cmd.Stderr = os.Stderr

cmd.SysProcAttr = &syscall.SysProcAttr{

    // ...

    GidMappingsEnableSetgroups: true,

}


查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信