是什么导致Linux中的系统调用以提升的权限运行

在linux中,可以为实用程序分配特定的用户/组,从而限制对它们的访问。 我明白了,但linux如何在系统调用级别应用权限。 例如,如果我尝试通过pthread_setschedparam更改调度策略或提高线程的优先级,则调用将失败,除非我以root身份运行我的进程。

所以我的问题是linux中的哪个组件负责将权限应用于系统调用? 如果我理解负责系统调用级别权限的组件,那么我可以请求系统管理员授予我的用户访问某些系统调用的权限。 也许权限不是系统调用,而是某些操作,例如更改线程优先级。 我需要告诉系统管理员,以便他可以选择性地访问此类操作?

内核的源代码如下所示:

让我们以settimeofday()为例,它设置内核时间,这将需要root权限

有一个函数security_settime() ,它检查安全性以设置时间

它调用cap_settime( ),它使用cap_settime( capable()函数

capable(int capability) [kernel / capability.c]

这将检查当前用户是否具有执行某些操作的能力,并且在设置时间情况下,该上限是CAP_SYS_TIME


 int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz) { static int firsttime = 1; int error = 0; if (tv && !timespec_valid(tv)) return -EINVAL; error = security_settime(tv, tz); if (error) return error; if (tz) { sys_tz = *tz; update_vsyscall_tz(); if (firsttime) { firsttime = 0; if (!tv) warp_clock(); } } if (tv) return do_settimeofday(tv); return 0; } 

这是非常不言自明的。 系统调用是对内核的调用,因此内核负责将安全策略应用于某些系统调用。

从Linux 2.6开始,Linux安全模块(LSM)框架已经到位,允许开发模块来控制内核中的某些访问。 使用LSM的最常见的实现可能是SELinux 。 另一个已知的实现是AppArmor 。

此外,2.6+内核中内置的一些capabilities(7)允许您控制某些特权系统调用是否可以由非特权用户完成。

在pthread_setschedparam(3)的特定情况下,答案取决于Linux内核版本,并且有些复杂。 查看由pthread_setschedparam(3)引用的联机帮助页sched_setscheduler(2) 权限和资源限制部分。

一般来说,使用某些系统调用的权限可能受调用者的capabilites(7)

一旦CPU跳入内核空间,它就会以root [*]的forms有效运行。

也就是说,它与您从用户角度思考的方式完全相反:不是以普通用户身份运行,而是以某种方式将自己提升为root来访问通常无法访问的文件/设备,内核空间代码始终如一以root身份运行并且必须进行用户权限检查以确保它将代表用户执行的操作限制为仅允许该用户执行的操作。


[*]像SELinux这样的MAC系统当然会修改它。