【问题标题】:Providing permissions for a root user in a kernel module在内核模块中为 root 用户提供权限
【发布时间】:2020-04-15 22:10:16
【问题描述】:

Linux Kernel 5.0.0-37

我正在编写一个函数来管理要作为指向struct inode_operations 的函数指针提供的权限。这是一个简化的存根实现:

#include <linux/cred.h>

int pfsw_permission(struct inode *ino, int op){
    if(uid_eq(INIT_USER->uid, get_current_user()->uid)){
        printk(KERN_INFO "Current user is root\n");
    } else {
        printk(KERN_INFO "Current user is not root\n");
    }
    if(op & (MAY_READ | MAY_WRITE)){
        return 0;
    }

    return -EACCES;
}

编译包含此函数的内核模块并尝试加载它时dmesg 显示以下错误:

Unknown symbol root_user (err -2)

我认为这是由于来自include/linux/sched/user.hINIT_USER 宏定义为

extern struct user_struct root_user;
#define INIT_USER (&root_user)

问题:为什么符号root_user 被声明但没有被定义?如何正确使用INIT_USER

【问题讨论】:

  • 这当然不是实现您的目标的正确方法。想一想现有的哪些标准功能会有类似的需求,然后看看它是如何实现的。

标签: c linux permissions linux-kernel linux-device-driver


【解决方案1】:

root_user 不会 seem 被 linux 内核使用 EXPORT_SYMBOL 导出;因此您不能从模块中使用它。

查看its definition,我们可以看到uid 的值设置为GLOBAL_ROOT_UID。这是在 include/linux/uidgid.h 中定义的宏,基本上只是 0 到 kuid_t 的类型转换,因此如果您只需要 UID,则可以只使用该宏。

所以...

为什么符号 root_user 已声明但未定义?

符号已定义。但是它没有被导出,所以你不能从模块中使用它。

如何正确使用INIT_USER

“不是”。你不能使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多