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)电话似乎绕过了保护.