亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在新用戶命名空間中使用憑據的 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 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號