我有一个简单的代码,基本上看起来像这样:
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.Setreuid
或unix.RawSyscall
与runtime.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
选项引起的;因此,我已将可执行文件复制到另一个没有此选项的驱动器。仍然没有效果。
所以,我该怎么办:
期待看到您的建议。
答案 0 :(得分:2)
对nosuid
选项的更深入研究表明,包括编译在内的整个过程必须在没有 nosuid
安装的驱动器上进行选项。
因此,基本上来说,解决此问题的步骤是:
nosuid
禁用的驱动器上创建目录; w
选项; go build
在目录中; chown root:root
应用于结果; chmod 4755
应用于结果; 要检测环境,您需要在安装过程中搜索不带nosuid
参数的目标。