为什么要在使用system()调用管理程序的setuid-c C程序中需要setuid(0)?

前端之家收集整理的这篇文章主要介绍了为什么要在使用system()调用管理程序的setuid-c C程序中需要setuid(0)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我不得不为某人做一个脏的 Linux黑客攻击,所以他们可以使用cupsenable printername shell命令启动一个打印机,而非root用户.我不希望他们能够使用完整的cupsenable语法作为root,所以我刚刚写了一个C包装器,在argv [1]中对输入进行消毒,并调用system(“cupsenable sanitizedprintername”).

我做了程序setuid根,但即使如此,cupsenable失败与“权限被拒绝”.然后我在system()之前插入了一个setuid(0)调用,并且看到它有效.

忽略有更好的方式给用户控制打印机的问题.可能有更好的方法.我感兴趣的是chmod的复杂与setuid(0)vs. system().为什么这样做呢?

解决方法

从人系统:

Do not use system() from a program with set-user-ID or set-group-ID privileges,because strange values for some environment variables might be used to subvert system integrity. Use the exec(3) family of functions instead,but not execlp(3) or execvp(3). system() will not,in fact,work properly from programs with set-user-ID or set-group-ID privileges on systems on which /bin/sh is bash version 2,since bash 2 drops privileges on startup.

和从男子bash:

If the shell is started with the effective user (group) id not equal to the real user (group) id,and the -p option is not supplied,no startup files are read,shell functions are not inherited from the environment,the SHELLOPTS variable,if it appears in the environment,is ignored,and the effective user id is set to the real user id.

看来你的setuid(0)电话规避了这种保护.

原文链接:https://www.f2er.com/c/115214.html

猜你在找的C&C++相关文章