为什么我需要与系统调用的行政程序的setuid root用户C程序中的setuid(0)()?

StackOverflow https://stackoverflow.com/questions/1051370

我不得不做一个肮脏的Linux黑客某人所以虽然是一个非root用户,他们可以先从cupsenable printername shell命令的打印机。我不想让他们能够使用cupsenable语法根的全部,所以我只写了一个C的包装,进行消毒在argv[1]输入,并呼吁system("cupsenable sanitizedprintername")

我所生成的程序的setuid根,但即便如此,cupsenable用“权限被拒绝”失败。然后我插入一个setuid(0)呼叫system()之前和,瞧,它的工作。

忽略有成为一个更好的方法,让打印机的用户控制的问题。有可能是一个更好的办法。我很感兴趣的是chmod u+ssetuid(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)通话规避这种保护。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top