具有 root 权限的库 (.so)

library (.so) with root privilege

我有一个使用一些 C 库的 C++ 程序。该程序作为 "unprivileged" 用户执行,但程序加载的库 (.so) 的一个且只有一个函数需要 root 权限(它需要写入 /dev/mem)。

是否存在一种仅让该函数或仅让该库以 root 身份执行而保留所有其余代码的方法 "unprivileged"?

感谢大家, 克里斯蒂安

以 root 身份启动程序并打开 /dev/mem 作为文件。然后将用户 ID 更改为侵入性较小的内容。该文件将保留其原始权限。

快速回答是。您不能在每个库的基础上切换用户标识,因为用户身份是每个进程 属性(如果您试图深入研究 /dev/mem 设备,您至少应该知道这一点)。

运行时库加载是一项库任务(在我的系统中由称为动态加载程序的共享对象 ld-linux-x86-64.so.2 完成)并且在运行时完成,因此无法授予特权访问权限出于安全原因。

无论如何,程序的 setuid 属性 允许您在 有效 用户(这是 setuid 用户)和 之间切换权限真正的用户(执行程序的用户)来回,所以在root账户的特殊情况下,你可以用它来访问/dev/mem.

无论如何,除了访问问题之外,写入 /dev/mem 是非常危险的,因为它映射到机器的物理地址 space(因此,它作为物理页面存在,来自不同的进程和内核,没有明显的顺序)。这必须通过可用的翻译 table 来完成,因为页面以非常动态的方式来来去去交换。无论如何你都在接触内核内存,所以在那里写东西时你必须格外小心。我不知道你想做什么,但你最好在写之前三思而后行(从你的问题来看,你不太了解进程的属性,很可能你也不知道内核中保留的页面的虚拟到物理转换)。

但是如果你想让你的系统崩溃,这是最好的方法。无论如何,如果那是您追求的目标,那么只需将整个程序设为 setuid root(如果您知道这句话的意思)并继续。或者更好的是,以 root 用户身份执行,这样您就不必担心 setuid 之类的问题。