1

我需要在我的程序中管理 Linux 用户帐户,因此我实际上需要某种 root 访问权限,但授予该程序 root 权限并不是最好的解决方案。
我怎样才能以节省的方式管理它。至少我不知道多进程架构。对于整个“通用的东西”,我使用 Qt。只有特定于操作系统的东西是我自己的。

4

1 回答 1

1

实现权限分离的“经典”解决方案如下:

  • 使用 setuid-0 安装程序
  • 在程序启动的早期(尽可能早地这样做,最好是“你的程序做的第一件事”):
    • 使用 socketpair() 创建一对套接字
    • fork() 你的进程
    • 让您的主进程使用 setuid() 删除其所有根 UID 并照常继续
  • 您的子进程将执行一个循环来处理从主进程发送的命令

结果将是您的主进程没有特殊权限,但是您有一个具有根特权的子进程,该子进程通过这些套接字连接到您的主进程。这些套接字是“未命名的”,这意味着没有其他程序可以访问它们。

当然,您仍然有些容易受到攻击。即使你的代码在你到达 fork() 之前是“安全的”,攻击者仍然可以稍后进入你的主程序,并向特权进程发送命令。即使子进程擅长验证其输入并且不会受到破坏,有效命令在由攻击者发出时仍然会导致问题 - 就像在您的情况下,攻击者可能会创建新帐户,甚至可能是具有 uid 的帐户0。

于 2012-10-05T13:07:27.120 回答