繁体   English   中英

为内核模块中的 root 用户提供权限

[英]Providing permissions for a root user in a kernel module

Linux Kernel 5.0.0-37

我正在编写一个函数来管理作为指向struct inode_operations的函数指针提供的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)

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

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

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

linux 内核似乎没有使用EXPORT_SYMBOL导出root_user 因此您不能从模块中使用它。

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

所以 ...

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

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

如何正确使用INIT_USER

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM