ioctl 命令的用户权限检查

Posted

技术标签:

【中文标题】ioctl 命令的用户权限检查【英文标题】:User Permission check on ioctl command 【发布时间】:2015-04-27 09:25:15 【问题描述】:

我正在实现 char 驱动程序 (Linux),并且我的驱动程序中有某些 IOCTL 命令只需要由 ADMIN 执行。

我的问题是如何在我的 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL。

【问题讨论】:

【参考方案1】:

您可以使用bool capable(int cap) 函数,如果用户有能力请求,则返回truecap 的可能值在内核源代码include/uapi/linux/capability.h 中列出(宏以 CAP_ 开头)。

如您所见,有许多类似管理员的功能。选择一个似乎更适合您的任务。或者只是采取CAP_SYS_ADMIN

【讨论】:

【参考方案2】:

写权限限制

如果设备以只读方式打开,您可以限制某些 ioctl 命令。为了实现这一点,给定ioctl 函数的第一个参数struct file *file,测试file->f_mode 是否设置了FMODE_WRITE 位。

if (!(file->f_mode & FMODE_WRITE))
        return -EACCES;

设置权限,以便只有特定用户或组具有设备的写入权限。这在某些用户应该能够通过以读写模式打开设备来控制设备而其他用户只能通过以只读模式打开设备来读取设备和获取状态的情况下很有用。

如果用户只想在确保不修改设备的情况下读取设备,用户也可以选择open() 模式为O_RDONLY 的设备。

能力限制

您可以将某些 ioctl 命令限制为仅在用户具有指定的 capability 时才被允许(CAP_SYS_ADMIN 可能合适)。

if (!capable(CAP_SYS_ADMIN))
        return -EACCES;

【讨论】:

以上是关于ioctl 命令的用户权限检查的主要内容,如果未能解决你的问题,请参考以下文章

检查用户是不是具有任何列出的所需权限

我的 discord.py 机器人有啥方法可以检查用户是不是具有使用命令的特定权限?

检查其他用户是不是对 linux 上的文件具有读/写权限

将root用户权限赋予普通用户

具有用户权限、客户端权限和限制的 Discord.js 命令处理程序

用户模式权限被拒绝绑定到套接字