gpt4 book ai didi

macos - 有没有办法对 go os.exec 调用进行 chroot/sandbox(防止 rm -rf/)

转载 作者:数据小太阳 更新时间:2023-10-29 03:27:35 29 4
gpt4 key购买 nike

我想测试/自动化一些存储库,基本流程是这样的:

repos := []string{"repo 1", "repo 2", ...}
for r := range repos {
// git clone the repo
// cd repo dir
// make test
// make build
// ...
}

我正在用 GO 做这件事使用 os.exec 调用所有系列的命令,例如:

 exec.Command("sh", "-c", "git clone project")

到目前为止一切顺利,但我想知道是否有一种方法可以保护/防止 Makefile 上的某些错误写入,这些错误可能会执行类似 rm -rf/ 的操作。并破坏我的主机。

基本上,我想使用系统库/工具,但只将输出限制/chroot 到特定的 workdir,这样我就可以避免为此预先构建一个 chroot。

一个可行的解决方案是使用 FreeBSD jail ,但我想知道是否有一种替代/安全的方法可以在不需要容器、virtualbox 等的情况下执行此操作;并使用基本的 Mac OS X 工作站。这样任何人都可以“安全”地运行和测试而无需担心。

有什么想法吗?

最佳答案

你应该可以使用 os.Setuid/os.Setgid (example.go):

package main

import (
"log"
"flag"
"os"
"os/exec"
"syscall"
)

func main() {
var oUid = flag.Int("uid", 0, "Run with User ID")
var oGid = flag.Int("gid", 0, "Run with Group ID")
flag.Parse()

// Get UID/GUID from args
var uid = *oUid
var gid = *oGid

// Run whoami
out, err := exec.Command("whoami").Output()
if err != nil {
log.Fatal(err)
return
}

// Output whoami
log.Println("Original UID/GID whoami:", string(out))
log.Println("Setting UID/GUID")

// Change privileges
err = syscall.Setgid(gid)
if err != nil {
log.Println("Cannot setgid")
log.Fatal(err)
return
}

err = syscall.Setuid(uid)
if err != nil {
log.Println("Cannot setuid")
log.Fatal(err)
return
}

// Execute whoami again
out, err = exec.Command("whoami").Output()
if err != nil {
log.Fatal(err)
return
}
log.Println("Changed UID/GID whoami:", string(out))


// Do some dangerous stuff
log.Println("Creating a executable file within /bin should fail...")
_, err = os.Create("/bin/should-fail")
if err == nil {
log.Println("Warning: operation did not fail")
return
}

log.Println("We are fine", err)
}

我还建议阅读有关正确设置 gid/uid 的内容(https://unix.stackexchange.com/questions/166817/using-the-setuid-bit-properly,在 C 语言中)。哦!它需要在 uid 之前设置 gid,因为如果不这样做,示例将失败。

您应该以 root 权限执行 example.go,并分别使用标志 -gid、-uid 为命令指定非特权 gid/uid。

sudo go run example.go -uid <unprivileged id> -gid <unprivileged id>

关于macos - 有没有办法对 go os.exec 调用进行 chroot/sandbox(防止 rm -rf/),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35962179/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com