12

我不得不为某人做一个肮脏的 Linux hack,以便他们可以cupsenable printername在作为非 root 用户时使用 shell 命令启动打印机。我不希望他们能够以cupsenableroot 身份使用整个语法,所以我只编写了一个 C 包装器来清理输入argv[1]并调用system("cupsenable sanitizedprintername").

我将程序 setuid 设为 root,但即便如此,cupsenable仍因“权限被拒绝”而失败。然后我在之前插入了一个setuid(0)电话system(),你瞧,它起作用了。

忽略有更好的方法让用户控制打印机的问题。可能有更好的方法。我感兴趣的是chmod u+svs. setuid(0)vs.的复杂性system()。为什么它会这样?

4

1 回答 1

19

来自man system

不要system()从具有 set-user-ID 或 set-group-ID 权限的程序中使用,因为某些环境变量的奇怪值可能会用于破坏系统完整性。请改用exec(3)函数族,但不要使用execlp(3)or execvp(3)system()事实上,在/bin/shbash 版本 2 的系统上,具有 set-user-ID 或 set-group-ID 特权的程序无法正常工作,因为 bash 2 在启动时会放弃特权。

man bash

如果 shell 以不等于实际用户(组)id 的有效用户(组)id 启动,并且-p未提供选项,则不读取启动文件,不从环境继承 shell 函数,SHELLOPTS变量,如果它出现在环境中,被忽略,有效用户id设置为真实用户id。

看来你的setuid(0)电话绕过了这种保护。

于 2009-06-26T21:40:50.853 回答