c++ - 处理应该能够管理 linux 用户帐户的程序的用户权限的最佳实践是什么

标签 c++ linux qt

<分区>

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

最佳答案

实现权限分离的“经典”解决方案是这样工作的:

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

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

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

关于c++ - 处理应该能够管理 linux 用户帐户的程序的用户权限的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12746777/

相关文章:

c - 如何修复 Ubuntu 15 上 libudev 的链接器错误

c++ - QObject* 列表的内存管理导致 QML 中出现 "Cannot read property X of null"错误

c - OpenCV cvHaarDetectObject 错误

c++ - 如何将图标设置为 QDialogBu​​ttonBox 中的新按钮?

C++应用程序仅在使用本地Windows调试器时运行,而不是哪个exe文件

c++ - 清除具有已删除赋值运算符的成员的类实例

c++ - 如果从 dlopen 的库中调用 dlopen() 是否存在负载泄漏?

linux - unix - chmod 文件的默认 future 权限

linux - 在 Bash 的变量中执行 Perl 脚本

c++ - Visual Studio 生成 "Error: uninitialized local variable ' x' "而在线编译器不生成 - 为什么?