为什么我需要setuid-root C程序中的setuid(0)来调用带有system()的管理程序?

JCC*_*CyC 11 c unix setuid privilege-elevation

我不得不为某人做一个肮脏的Linux黑客攻击,这样他们就可以cupsenable printername在非root用户的情况下使用shell命令启动打印机.我不希望他们能够以cupsenableroot 身份使用整个语法,所以我只写了一个C包装器来清理输入argv[1]和调用system("cupsenable sanitizedprintername").

我使程序setuid root,但即便如此,cupsenable失败了"权限被拒绝".然后我setuid(0)在之前插入了一个电话system(),并且看,它起作用了.

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

Joh*_*ica 19

来自man system:

不要使用system()具有set-user-ID或set-group-ID权限的程序,因为某些环境变量的奇怪值可能会用于破坏系统完整性.请改用exec(3)函数系列,而不是execlp(3)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)电话似乎绕过了保护.

  • 哇.好吧,我确实说它很脏.似乎我所做的就是说服system()产生的bash过程,我实际上,真的,老实说是root,向上帝发誓.似乎有些重构是有道理的. (2认同)