代码之家  ›  专栏  ›  技术社区  ›  Roland

为什么SETUID在Raspberry Pi上不起作用?

  •  0
  • Roland  · 技术社区  · 4 年前

    我正在尝试创建一个可以以用户身份运行的关机命令,即一个不是以root身份运行的flask网页。听起来很简单,只要放一个 shutdown SETUID脚本中的命令。因为SETUID不适用于shell脚本,所以我从C程序创建了一个可执行文件。

    问题是,这在目标机器Raspberry Pi Zero W上不起作用。我在Ubuntu 20.4 pc上测试了同样的东西,它在那里运行得非常完美。因此,这种方法本身似乎是正确的,但存在覆盆子pi问题。

    Pi运行这个操作系统:

    cat /etc/issue
    -->
    Raspbian GNU/Linux 10 \n \l
    

    这是usershutdown.c:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(){
       system("/sbin/poweroff");
    }
    

    以下是可执行文件的权限:

    -rwsr-xr-x 1 root   root   7988 Dec 20 23:59 usershutdown
    

    我在/etc/fstab中检查了根磁盘的挂载选项,并在其中添加了 ,suid 并重新启动:

    PARTUUID=738a4d67-02  /               ext4    defaults,noatime,suid  0       1
    

    当按预期调用exec时,Pi上会显示以下错误消息:

    $ ./usershutdown 
    Failed to set wall message, ignoring: Interactive authentication required.
    Failed to power off system via logind: Interactive authentication required.
    Failed to open initctl fifo: Permission denied
    Failed to talk to init daemon.
    $
    

    这就是Pi上的工作原理,当以root/sudo调用exec时,与它的ssh连接会关闭,设备会自动关闭而不会出错:

    $ sudo ./usershutdown 
    $ Connection to picamhq closed by remote host.
    Connection to picamhq closed.
    $ 
    

    我该怎么解决这个问题?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Nate Eldredge    4 年前

    system() 通过shell运行程序,从安全角度来看,从任何setuid程序运行shell都是极其危险的;用户可以通过多种方式劫持它来做其他事情(查找滥用的方式 IFS 例如)。为了缓解这种情况,常用的shell会尝试注意它们何时在setuid下运行(通过注意 real and effective uids are different )并放弃特权。

    因此,更安全的选择是跑步 poweroff 通过 execle 相反。( execl 也可以工作,但传递您无法控制的环境变量是有风险的,因此最好让您的程序设置一个已知安全的环境。)

    您仍然存在一个问题,即您的setuid程序可由任何人运行,因此服务器上任何无特权的本地用户都可以将其关闭。你需要确保它只能由你的应用程序运行的用户执行。因为文件的所有者必须是 root 为了使setuid工作,这将需要一些与组的交互。

    您可以通过设置来避免所有这些麻烦和风险 sudo 允许应用程序的用户运行 断电 不带密码的命令,使用 NOPASSWD 指令在 /etc/sudoers 。这将:

    • 仅限于所需用户

    • 清洁环境

    • 避免必须维护的额外setuid程序所固有的风险(例如,未来的libc错误,或者你想添加功能等)

    请参阅 https://unix.stackexchange.com/questions/18830/how-to-run-a-specific-program-as-root-without-a-password-prompt 更多。

    推荐文章