gpt4 book ai didi

c - 确保系统调用中的 UID/GID 检查在 RCU 临界区中执行

转载 作者:IT王子 更新时间:2023-10-29 01:20:46 24 4
gpt4 key购买 nike

任务

我有一个我为我的 RaspBerry Pi 2 编写的小内核模块,它实现了一个额外的系统调用来生成功耗指标。我想修改系统调用,以便只有在特殊用户(例如“root”或用户“pi”)发出时才会调用它。否则,调用将跳过其主体部分并返回成功。


背景工作

我已经详细阅读了这个问题,I've found a similar question on SO ,但从我的角度来看,它存在很多问题(如下所述)。


问题

  • 链接的问题指出 struct task_struct 包含指向 struct cred 的指针元素,如 linux/sched.h 中所定义和 linux/cred.h。我的系统上不存在这两个 header 中的后者,而前者未显示指向 struct cred 元素的指针的任何声明。 这有意义吗?
    • 愚蠢的错误。这完全存在于内核头文件中(即:/usr/src/linux-headers-$(uname -r)/include/linux/cred.h),我在 gcc 中搜索- 在 /usr/include/linux 中构建 header 。
  • 即使上述方法有效,也没有提及我是否会得到 the real, effective, or saved UID for the process . 是否有可能从系统调用中获取这三个值中的每一个?
    • cred.h 已经包含了所有这些。
  • 在内核模块中是否有一种安全的方法可以在不解析/etc/group的情况下快速确定用户属于哪些组?
    • cred.h 已经包含了所有这些。

更新

因此,剩下的唯一有效问题如下:

Note, that iterating through processes and reading process's credentials should be done under RCU-critical section.

最佳答案

首先,添加一个新的系统调用很少是正确的做法。最好通过现有机制来做事,因为您将受益于双方已经存在的工具:内核中现有的实用程序函数、用户空间中现有的 libc 和高级语言支持。文件是 Linux 中的核心概念(与其他 Unix 系统一样),大多数数据都是通过文件交换的,device files或特殊文件系统,例如 procsysfs .

I would like to modify the system call so that it only gets invoked if a special user (such as "root" or user "pi") issues it.

你不能在内核中这样做。从设计的角度来看,这不仅是错误的,而且甚至是不可能的。内核对用户名一无所知。内核中关于用户的唯一知识是一些特权操作保留给根目录中的用户 0 namespace (不要忘记最后一部分!如果这对你来说是新的,那就表明你不应该做一些高级的事情,比如添加系统调用)。 (许多操作实际上寻找 capability 而不是 root。)

您要使用的是sysfs。阅读 kernel documentation并寻找非古老的在线教程或现有的内核代码(如今使用 sysfs 的代码通常非常干净)。使用 sysfs,您可以通过 /sys 下的文件公开信息。访问控制取决于用户空间——在内核中有一个合理的默认值,并在引导脚本中执行诸如调用 chgrpchmodsetfacl 之类的操作。这是使用现有机制时不需要在用户端重新发明的众多轮子之一。

sysfs show 方法自动锁定文件,因此一次只有一个内核线程可以执行它。这是使用现有机制时不需要在内核端重新发明的众多轮子之一。

关于c - 确保系统调用中的 UID/GID 检查在 RCU 临界区中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39132262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com