【问题标题】:Linux character-device protectionLinux 字符设备保护
【发布时间】:2014-01-14 09:22:38
【问题描述】:

我想保护我的字符设备免受应用程序操作的影响。 我希望只有特定的应用程序才能在设备上进行操作。

我该怎么做?

谢谢

【问题讨论】:

  • 您如何确定您的应用程序正在访问它?
  • 这就是我要问的......
  • *nix 中的基本安全性使用文件权限和所有权。打印机端口归 lpadmin 所有以限制访问。以类似的方式,只允许 rw 访问 char 设备节点到拥有该应用程序的相同唯一用户名和组。但是,如果您正在寻找无法击败的东西,那么您需要寻找安全加密狗,即硬件解决方案。
  • 我正在编写char设备,我可以只定义一个特定的唯一应用程序名称,而拒绝所有其他的吗?当应用程序打开设备文件时我会查询进程名称,如果没有匹配我会返回-ENODEV
  • 您需要使用 SELinux。无法在设备级别限制访问。没有任何 Linux 设备驱动程序有任何关于执行设备操作的系统调用的应用程序代码的信息。

标签: char kernel linux-device-driver


【解决方案1】:

这可能不是正确的答案(因为我没有测试它)。但我相信这会奏效。

我希望,您对task_struct 中的当前字段有所了解,它将为您提供进程的当前 PID。请参考这个线程。 how does current->pid work for linux?

所以你可以使用task_struct的comm字段来代替pid。

http://lxr.free-electrons.com/source/include/linux/sched.h#L1180.

在您的驱动程序中保留一组允许的应用程序名称。在/dev/<yourchardriver> open() 操作期间,根据允许列表检查comm 字段。

示例文件操作结构。

struct file_operations fops = { /* these are the file operations provided by our driver */
    .owner = THIS_MODULE, /*prevents unloading when operations are in use*/
    .open = device_open,  /*to open the device*/
    .write = device_write, /*to write to the device*/
    .read = device_read, /*to read the device*/
    .release = device_close, /*to close the device*/
    .llseek = device_lseek
};

当您在用户空间调用 open("/dev/sampledrv") 时,将在您的驱动程序中调用 device_open()。所以这些验证可以在这里完成。

【讨论】:

  • 这个答案是不赞成投票的候选人,因为不清楚设备驱动程序如何获得任务结构。
  • @JonathanBen-Avraham 通过引用stackoverflow.com/questions/11915728/… 和更多线程,我只是假设。也许我会测试并让你知道。
  • 我认为这可能可行,但您需要添加一个 sn-p 代码来了解如何操作。使用示例 UART 驱动程序或简单的 misc 示例驱动程序的 open 函数来显示您将在何处以及如何添加建议的代码。
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
相关资源
最近更新 更多