是什么导致设备文件无法执行?

时间:2018-10-12 21:06:05

标签: permissions linux-kernel

我正在编写一个内核字符设备驱动程序,为此我已经实现了fops.readFIONREAD0x541B)ioctl。 read返回的数据是ELF可执行文件。 ls -l确认设备具有r-x权限,以下两个命令均允许我执行所包含的ELF二进制文件:

# cp /dev/foo0 /tmp/bar && /tmp/bar
-or-
# cat /dev/foo0 > /tmp/bar && /tmp/bar
foo_open
foo_ioctl 0x0000541B
foo_read size=131072 off=0
foo_ioctl 0x0000541B
foo_read size=131072 off=13096
foo_release
Hello from /tmp/bar!
...

请注意,内核消息指示所调用的各种驱动程序消息。但是,当我尝试直接运行设备时,出现错误:

# /dev/foo0
foo_open
foo_release
/bin/sh: 6: /dev/foo0: Permission denied

什么检查可能会导致权限错误,是否有可能在基本不破坏Linux的情况下覆盖它?我正在使用带有最小sysroot映像的4.18.3内核。

2 个答案:

答案 0 :(得分:4)

来自man 2 execve

  

访问。文件或脚本解释器不是常规文件。

Linux内核仅允许执行常规文件,而不允许字符设备或任何其他特殊文件。内核会检查in the do_open_execat function in fs/exec.c

if (!S_ISREG(file_inode(file)->i_mode))
    goto exit;

如果确实需要,您可以在不检查内核的情况下重建内核,但这可能是有充分理由的。

答案 1 :(得分:1)

简短的回答:您(永远)不允许exec设备文件。 execve man page列表

  

EACCES

      该文件或脚本解释器不是常规文件。

ERRORS部分。