【问题标题】:what causes system calls in linux to run at elevated permissions是什么导致linux中的系统调用以提升的权限运行
【发布时间】:2013-02-08 19:23:02
【问题描述】:

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

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

【问题讨论】:

    标签: c linux


    【解决方案1】:

    内核的源代码如下所示:

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

    有一个功能security_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;
    }
    

    【讨论】:

    • 要回答如何授予访问权限的问题,可以使用例如setcap 将这些功能授予某个可执行文件。
    • setcap 位于单个文件级别。如果我重新编译我的过程,用新文件替换旧文件,这些仍然适用吗?有没有可以在用户级别应用的类似命令?
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      在 pthread_setschedparam(3) 的特定情况下,答案取决于 Linux 内核版本,并且有点复杂。查看sched_setscheduler(2) 手册页的权限和资源限制部分,pthread_setschedparam(3) 引用了该部分。

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

      【讨论】:

      • 您真的应该阅读 sched_setscheduler(2) 手册页!那里说“在 2.6.12 之前的 Linux 内核中,只有特权 (CAP_SYS_NICE) 进程可以设置非零静态优先级(即设置实时调度策略)。”进一步“自 Linux 2.6.12 起,RLIMIT_RTPRIO 资源限制为 SCHED_RR 和 SCHED_FIFO 策略定义了非特权进程的静态优先级上限”。 HTH。
      【解决方案4】:

      一旦 CPU 跳转到内核空间,它就会以root[*] 的身份有效运行。

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


      [*] MAC SELinux 等系统当然会修改它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-24
        • 2016-03-04
        • 2017-06-03
        • 2021-10-08
        • 2020-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多