SuSE 中的 suid 位通过 system() 无效

SuSE 中的 suid 位通过 system() 无效

[编辑:重新审视这个问题,看到它仍然被错误地标记为重复] SE 上的以下问题不是重复的,因为它询问如何使用 suid 位执行 bash,这是一种特殊情况,根本不起作用: setuid 位似乎对 bash 没有影响 第一个区别是,在我的示例中,我执行 whoami,而不是 bash。第二个区别是它实际上在 Ubuntu 上按预期工作,但在 SuSE 上却不然。

Suid 位在我运行 Ubuntu 的 PC 上工作正常,但在 SLES 测试实例上却不行。 SLES 计算机上已安装的 xfs 文件系统上未设置 nosuid 标志。ls显示只有我的机器和 SLE 服务器为可执行文件设置了相同的权限。那么为什么可执行文件仍然以当前用户而不是所有者的身份运行呢?

execsudo.c:

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[]) {
    system(argv[1]);
    return 0;
}

重击:

gcc -o setuid-test execsudo.c ;
sudo chown nobody ./setuid-test;
sudo chmod +s ./setuid-test;
./setuid-test "whoami" 
# Outputs current user instead of nobody

[编辑2] 我仍然没有解决这个问题,但我想这可能是因为SuSE机器是一个虚拟机。解决方法可能是通过 /etc/sudoers 配置此行为。

答案1

setuid可能“有效”,但很容易被检测到并在以后撤消。我将其与类似目的的程序进行了比较sue,我在本地的备用帐户中使用它dickey(将该程序命名为dickey)。

在我的 Debian 7 系统上,我得到以下输出(你的系统是“foo”):

$ ./foo id;dickey id
uid=1001(tom) gid=100(users) euid=1006(dickey) egid=50(staff) groups=100(users),27(sudo)
uid=1006(dickey) gid=100(users) groups=100(users),27(sudo)

在我的 OpenSUSE 13 上,我得到了不同的结果:

$ ./foo id;dickey id
uid=1000(thomas) gid=100(users) groups=100(users),10(wheel)
uid=1003(dickey) gid=100(users) groups=100(users),10(wheel)

造成差异的原因是你的程序没有设置它的真实的uid/gid 值匹配有效的uid/gid 值,并且一个有用的程序(可能是 apparmor)正在剥离不需要的权限。

这仍然不是一个完美的解决方案(我有一个 CentOS 7 的待办事项,其中另一个有用的程序干扰了 setuid 程序)。但它应该为您指明正确的方向。

进一步阅读:

相关内容