我正在实现char驱动程序(Linux),我的驱动程序中有一些IOCTL命令,只需要由ADMIN执行。
我的问题是如何检查我的ioctl命令实现下的用户权限,并限制非特权用户访问IOCTL。
答案 0 :(得分:3)
如果用户具有请求的功能,您可以使用bool capable(int cap)
函数,该函数返回 true 。 cap 的可能值列在include/uapi/linux/capability.h
的内核源代码中(以 CAP _ 开头的宏)。
如您所见,有许多类似管理员的功能。选择一个看起来更适合你的任务。或者只需要 CAP_SYS_ADMIN 。
答案 1 :(得分:2)
如果设备以只读方式打开,则可以限制某些ioctl命令。为了实现这一点,给定ioctl
函数的第一个参数struct file *file
,测试file->f_mode
是否设置了FMODE_WRITE
位。
if (!(file->f_mode & FMODE_WRITE))
return -EACCES;
设置权限,以便只有特定用户或组具有设备的写入权限。这在某些用户应该能够通过以读写模式打开设备来控制设备的情况下非常有用,而其他用户只能通过以只读模式打开设备来获取状态。
如果用户只想读取设备,同时确保不修改设备,则用户也可以选择open()
模式为O_RDONLY
的设备。
如果用户具有指定的capability(CAP_SYS_ADMIN
可能合适),您可以限制某些ioctl命令。
if (!capable(CAP_SYS_ADMIN))
return -EACCES;