我需要在我的程序中管理 Linux 用户帐户,因此我实际上需要某种 root 访问权限,但授予该程序 root 权限并不是最好的解决方案。
我怎样才能以节省的方式管理它。至少我不知道多进程架构。对于整个“通用的东西”,我使用 Qt。只有特定于操作系统的东西是我自己的。
问问题
46 次
1 回答
1
实现权限分离的“经典”解决方案如下:
- 使用 setuid-0 安装程序
- 在程序启动的早期(尽可能早地这样做,最好是“你的程序做的第一件事”):
- 使用 socketpair() 创建一对套接字
- fork() 你的进程
- 让您的主进程使用 setuid() 删除其所有根 UID 并照常继续
- 您的子进程将执行一个循环来处理从主进程发送的命令
结果将是您的主进程没有特殊权限,但是您有一个具有根特权的子进程,该子进程通过这些套接字连接到您的主进程。这些套接字是“未命名的”,这意味着没有其他程序可以访问它们。
当然,您仍然有些容易受到攻击。即使你的代码在你到达 fork() 之前是“安全的”,攻击者仍然可以稍后进入你的主程序,并向特权进程发送命令。即使子进程擅长验证其输入并且不会受到破坏,有效命令在由攻击者发出时仍然会导致问题 - 就像在您的情况下,攻击者可能会创建新帐户,甚至可能是具有 uid 的帐户0。
于 2012-10-05T13:07:27.120 回答