为什么在使用 system() 调用管理程序的 setuid-root C 程序中需要 setuid(0)?
我必须为某人做一次肮脏的 Linux 黑客攻击,这样他们就可以在非 root 用户身份的情况下使用 cupsenable Printername
shell 命令启动打印机。 我不希望他们能够以根身份使用整个 cupsenable
语法,因此我只编写了一个 C 包装器来清理 argv[1]
中的输入并调用system("cupsenable sanitizedprintername")
。
我将程序设为 setuid root,但即便如此,cupsenable 仍因“权限被拒绝”而失败。 然后我在 system()
之前插入了一个 setuid(0)
调用,你瞧,它起作用了。
忽略是否有更好的方法让用户控制打印机的问题。 可能有更好的方法。 我感兴趣的是 chmod u+s
与 setuid(0)
与 system()
的复杂性。 为什么它会这样?
I had to do a dirty Linux hack for somebody so they could start a printer with the cupsenable printername
shell command while being a non-root user. I didn't want them to be able to use the entirety of the cupsenable
syntax as root, so I just wrote a C wrapper that sanitizes the input in argv[1]
and calls system("cupsenable sanitizedprintername")
.
I made the program setuid root, but even so, cupsenable
failed with "permission denied". Then I inserted a setuid(0)
call before system()
and, lo and behold, it worked.
Disregard the issue of there being a better way to give users control of the printer. There probably is a better way. What I'm interested in are the intricacies of chmod u+s
vs. setuid(0)
vs. system()
. Why did it behave that way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
来自
man系统
:来自
man bash
:看来您的
setuid(0)
调用绕过了该保护。From
man system
:And from
man bash
:It appears your
setuid(0)
call circumvented that protection.