set-UID位不按预期工作

时间:2014-01-10 23:01:13

标签: setuid

我正在运行一个覆盆子pi,并希望创建一个可执行文件,它应该在几秒钟之后重新启动它。 (我打算通过ssh触发它并在实际重启之前注销)

我用c ++创建了一个可执行文件,内容为:

#include <cstdlib>

int main () {
    system("sleep 5");
    system("reboot");
    return 0;
}

生成的可执行文件的ls -l:

---s--x--x 1 root ben 6191 Jan 10 15:42 reboot

我的计划现在是将setuid位与root用户结合使用作为二进制文件的所有者,以便任何用户都可以执行reboot命令。

不幸的是,这没有用完,在运行程序时它给了我:

Failed to issue method call: Access denied
Must be root.

有关为什么不起作用的任何解释?

我知道可能有更简单的方法来做到这一点。这个问题的确旨在理解为什么这种方式不起作用。

提前谢谢你和问候

3 个答案:

答案 0 :(得分:2)

我与setuid位和bash的某些版本有类似的问题。在我的情况下,解决方案是编写这样的程序:

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

int main(int argc, char **argv)
{
  // circumvent busybox ash dropping privileges
  uid_t uid = geteuid();
  setreuid(uid, uid);

  system("do something....");
  return 0;
}

我希望这对你也有帮助。

答案 1 :(得分:1)

虽然没有直接回答您的问题,但允许用户使用shutdown运行sudo怎么样?您甚至可以指定允许使用的选项(请参阅sudoers(5)手册页)。或者使用适当的参数创建包装器脚本,并让用户运行它。它甚至可以检查它是否具有适当的权限,并在必要时尝试通过sudo重新执行自己:

#!/bin/sh
if test `id -u` -eq 0; then
    # do your stuff - shutdown, poweroff, whatever
else
    exec sudo $0 "$@"
fi

答案 2 :(得分:0)

根据this文档,system()实际上调用了/bin/sh,在某些发行版中,它忽略了Set-UID位选项。

您可以尝试使用exec()而不是system()并直接调用/sbin/shutdown吗?