我有一个使用一些C库的C ++程序。该程序作为“非特权”用户执行,但程序加载的库(.so)中只有一个函数需要root权限(需要写入/ dev / mem)。
是否存在只有该函数或仅以root身份执行该库的方法,将所有其余代码保留为“无特权”?
感谢所有人, 克里斯蒂安
答案 0 :(得分:2)
快速回答是否。您无法在每个库的基础上切换用户ID,因为用户身份是每个进程的属性(如果您尝试深入了解/dev/mem
设备,至少应该知道这一点。)
运行时库加载是一个库任务(它由我的系统中称为动态加载器ld-linux-x86-64.so.2
的共享对象完成)并且它在运行时完成,因此不能授予它任何特权访问,出于安全考虑。
无论如何,程序的setuid属性允许您在有效用户(这是setuid用户)和真实用户(执行的用户)之间切换权限该程序)并返回,因此在root
帐户的特殊情况下,您可以使用该帐户访问/dev/mem
。
无论如何,除了访问问题之外,写入/dev/mem
是非常危险的,因为它映射到机器的物理地址空间(因此,它作为物理页面,来自不同的进程和内核,没有明显的顺序)。这必须通过可用的转换表来完成,因为页面以非常动态的方式进行交换。无论如何,你正在触摸内核内存,所以在写作时你必须非常小心。我不知道你想做什么,但你最好在写作之前三思而后行(从你的问题来看,你不太了解一个过程及其特性,它是'最有可能你也不知道内核中保存的页面的虚拟到物理翻译。
但是如果你想让你的系统崩溃,这是一个完美的方法。无论如何,如果这是你追求的目标,那么只需让整个程序setuid root(如果你知道这句话的意思)并继续。或者甚至更好,以root用户身份执行,因此您不必担心setuid等。
答案 1 :(得分:0)
以root身份启动程序并将/ dev / mem作为文件打开。然后将用户ID更改为更少侵入性的内容。该文件将保留其原始权限。