jjzjj

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

coder 2024-07-10 原文

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

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/

有关macos - 有没有办法对 go os.exec 调用进行 chroot/sandbox(防止 rm -rf/)的更多相关文章

  1. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  2. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  3. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  4. python - python中有没有类似于ruby的||=的表达式 - 2

    我在Ruby中遇到了一个有趣的表达式:a||="new"表示如果没有定义a,则将"new"值赋给a;否则,a将保持原样。在进行一些数据库查询时很有用。如果设置了该值,我不想触发另一个数据库查询。所以我在Python中尝试了类似的思路:a=aifaisnotNoneelse"new"失败了。我认为这是因为如果未定义a,则无法在Python中执行“a=a”。所以我能得出的解决方案是检查locals()和globals(),或者使用try...except表达式:myVar=myVarif'myVar'inlocals()and'myVar'inglobals()else"new"或try:

  5. ruby - 有没有一种 Ruby 方法可以删除初始化程序中的样板代码? - 2

    我写了很多initialize代码,将attrs设置为参数,类似于:classSiteClientattr_reader:login,:password,:domaindefinitialize(login,password,domain='somedefaultsite.com')@login=login@password=password@domain=domainendend有没有更像Ruby的方式来做到这一点?我觉得我在一遍又一遍地编写相同的样板设置代码。 最佳答案 您可以使用rubyStruct:classMyClass或

  6. ruby - 在 factory_girl 中有没有办法获取 attributes_for 并为同一个实例元素创建? - 2

    如果我想使用“create”构建策略创建和实例,然后想使用“attributes_for”构建策略进行验证,是否可以这样做?如果我在工厂中使用序列?在Machinistgem中有可能吗? 最佳答案 不太确定我是否完全理解。而且我不是机械师的用户。但听起来您只是想做这样的事情。@attributes=FactoryGirl.attributes_for(:my_object)my_object=MyObject.create(@attributes)my_object.some_property.should==@attributes

  7. ruby - 找不到 macOS Mojave 'ruby/config.h' 文件 - 2

    当我尝试在macOSMojave(10.14.1)上构建带有ruby​​支持(--enable-rubyinterp)的vim(8.1.0509)时,出现错误:Infileincludedfrom/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby.h:33:/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/ruby.h:24:10:fatalerror:'ru

  8. ruby-on-rails - 有没有办法在 Rails 中以编程方式查看(或打印)方法定义? - 2

    假设我在我的Rails应用中某处定义了一个名为bla的函数。在ruby​​或rails中有没有一种方法可以动态/以编程方式打印用于定义该函数的代码?例如:defblaputs"HiThere"end然后如果我调用一个函数,例如get_definition:putsget_definition(:bla)这会打印出来"puts\"HiThere\""有规范的方法吗?我以前实际上不需要这样做,而且我知道这在Rails中并不是很常见的做法。我也不想使用元(反射)编程定义我的方法,然后存储用于定义我的方法的字符串。感谢您的帮助! 最佳答案

  9. ruby - 有没有办法在 Ruby 中执行编译时类型检查? - 2

    我知道Ruby是动态和强类型的,但据我所知,由于每个参数缺少显式类型表示法(或契约),当前语法不允许在编译时检查参数类型。如果我想执行编译时类型检查,我有哪些(实际成熟的)选项?更新我的意思是类型检查类似于典型的静态类型语言。比如C。例如,C函数表示每个参数的类型,编译器检查传入的参数是否正确。voidfunc1(structAAAaaa){structBBBbbb;func1(bbb);//Wrongtype.Compiletimeerror.}作为另一个例子,Objective-C通过放置显式类型信息来做到这一点。-(id)method1:(AAA*)aaa{BBB*bbb=[[A

  10. ruby - 有没有办法让 2.4.0 中的 Ruby 弃用警告静音? - 2

    从Ruby2.4.0开始,对于使用某些已弃用的功能,会出现弃用警告。例如,Bignum、Fixnum、TRUE和FALSE都会触发弃用警告。当我修复我的代码时,有相当多的代码我希望它保持沉默,尤其是在Rails中。我该怎么做? 最佳答案 moduleKerneldefsuppress_warningsoriginal_verbosity=$VERBOSE$VERBOSE=nilresult=yield$VERBOSE=original_verbosityreturnresultendend>>X=:foo=>:foo>>X=:bar

随机推荐