为什么我需要与系统调用的行政程序的setuid root用户C程序中的setuid(0)()?
-
20-08-2019 - |
题
我不得不做一个肮脏的Linux黑客某人所以虽然是一个非root用户,他们可以先从cupsenable printername
shell命令的打印机。我不想让他们能够使用cupsenable
语法根的全部,所以我只写了一个C的包装,进行消毒在argv[1]
输入,并呼吁system("cupsenable sanitizedprintername")
。
我所生成的程序的setuid根,但即便如此,cupsenable
用“权限被拒绝”失败。然后我插入一个setuid(0)
呼叫system()
之前和,瞧,它的工作。
忽略有成为一个更好的方法,让打印机的用户控制的问题。有可能是一个更好的办法。我很感兴趣的是chmod u+s
与setuid(0)
与system()
的复杂性。为什么它的行为呀?
解决方案
从man system
:
不要从程序组与用户ID或设置组ID的权限使用
system()
,因为对于某些环境变量奇怪的值可能被用来破坏系统的完整性。使用功能的exec(3)
家庭,而不是,但不execlp(3)
或execvp(3)
。system()
不会,事实上,正确地从与设置用户ID或在其上/bin/sh
是bash的版本2系统上的程序设定组ID的权限工作,因为bash的2滴在启动时的特权。
和从man bash
:
如果该外壳开始与有效用户(组)标识不等于真实的用户(组)标识,并且未提供
-p
选项,没有启动文件被读取,shell函数不会从环境中继承,的SHELLOPTS
变量,如果它出现在环境中,将被忽略,并且有效用户ID被设置为实际用户ID。
看来你setuid(0)
通话规避这种保护。
不隶属于 StackOverflow