getuid / geteuid奇怪的行为

时间:2018-06-20 10:38:57

标签: linux go

我有一个简单的代码,基本上看起来像这样:

package main

import (
    "fmt"
    "golang.org/x/sys/unix"
)

func main() {
    fmt.Printf("real: %d, effective: %d\n", unix.Getuid(), unix.Geteuid())
}

基本上输出实际和有效的用户ID。现在,使用以下命令进行构建:go build main.go;我还致电sudo chown root:root main && sudo chmod 4755 main以获得文件的-rwsr-xr-x权限。

如果我了解setuid位(s部分)的概念,那么它稍后允许我在源文件中使用setuid(请注意,我将必须使用unix.Setreuidunix.RawSyscallruntime.LockOSThread结合使用)。但是,无论什么总是返回real: 1000, effective: 1000,当前编译的代码。

起初我以为某些Go代码可能就是这种情况,对它进行了两次三次检查,但是结果仍然相同。然后我走得更远,并在c中进行了模拟:

int main(int argc, char* argv){
   printf("real: %d, effective: %d\n", getuid(), geteuid());
   fflush(stdout);
}

已编译,将其切成root:root,将其切成4755,您猜怎么着?它仍然做同样的事情,它输出real: 1000, effective: 1000

因此,如果两个版本均已完成:Go和C版本一旦编译,就权限进行了适当更改,将返回相同的结果:忽略该设置,否则可能会对系统设置有所影响。

更新[0] :我发现这种情况可能是由已安装驱动器的nosuid选项引起的;因此,我已将可执行文件复制到另一个没有此选项的驱动器。仍然没有效果。

所以,我该怎么办:

  1. 要打击这种行为?
  2. 要在将来发现这种环境?

期待看到您的建议。

1 个答案:

答案 0 :(得分:2)

nosuid选项的更深入研究表明,包括编译在内的整个过程必须在没有 nosuid安装的驱动器上进行选项。

因此,基本上来说,解决此问题的步骤是:

  1. nosuid禁用的驱动器上创建目录;
  2. 确保目录组是您的组;
  3. 确保目录组权限具有w选项;
  4. 将源复制到此目录;
  5. go build在目录中;
  6. chown root:root应用于结果;
  7. chmod 4755应用于结果;
  8. 从/ nonosuid / directory /
  9. 享受结果

要检测环境,您需要在安装过程中搜索不带nosuid参数的目标。