我在 setuid 和 setgid 方面遇到了问题。我编写了以下 C 代码:
int main() {
setuid(0);
setgid(0);
system("/path/to/script.sh");
return 0;
}
使用 gcc 进行编译:
gcc test.c -o test
然后我使用了chmod +s
。里面script.sh
只有id
命令。以下是可执行文件的权限test
:
-rwxr-sr-x 1 root root 8464 mag 15 20:14 test
当我执行该程序时,我得到以下输出:
uid=1000(user) gid=1000(user) gruppi=1000(user)
id
为什么我没有得到root 执行的输出?
答案1
您不能使用 setuid 和 setgid 以其他用户身份运行 shell 脚本。这是一项安全功能,您可以阅读更多相关信息在对这个 UL 帖子的非常全面的最佳回答中。
答案2
摘自 MAN 页面setuid()
因此,如果一个 set-user-ID-root 程序想要暂时放弃 root 权限,假设其为非特权用户,然后重新获得 root 权限,则不能使用 setuid()。您可以使用 seteuid(2) 来实现这一点。
如果成功,则返回零。如果出错,则返回 -1,并适当设置 errno。
Note: there are cases where setuid() can fail even when the caller is
UID 0; it is a grave security error to omit checking for a failure
return from setuid().
除其他事项外,这意味着用户无法root
通过此命令成为。
如果发布的代码检查了这些命令的返回值,就会发现命令失败了。