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

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);
}

编译,chown'ed为root:root,chmod'ed为4755,你猜怎么着?它仍然做同样的事情,它输出real: 1000, effective: 1000

因此,如果两个版本均已编译:Go和C版本,在权限方面进行了适当的更改,则返回相同的结果:忽略设置,否则可能会对系统设置执行某些操作。

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

所以我该怎么做:
  • 要打击这种行为?
  • 将来要检测这种环境吗?

  • 期待看到您的建议。

    最佳答案

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

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

  • 在禁用nosuid的驱动器上创建目录;
  • 确保目录组是您的组;
  • 确保目录组权限具有w选项;
  • 将源复制到此目录;
  • 目录中的
  • go build;
  • chown root:root应用于结果;
  • chmod 4755应用于结果;
  • 享受来自/nonosuid/directory/
  • 的结果

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

    关于linux - getuid/geteuid奇怪的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50946246/

    10-13 07:20