【问题标题】:Check SUID attribute for open file within a kernel module检查内核模块中打开文件的 SUID 属性
【发布时间】:2019-08-07 14:10:33
【问题描述】:

我正在编写一个内核模块,它需要检查给定 file 描述符的 suid 属性。 我检查了各种内核结构,但找不到有关该主题的任何线索。

我希望以某种方式找到一个包含按位 Unix-stile 权限的字段,但我找不到。

我的目标是编写一个函数,它只说明给定文件描述符所引用的文件是否设置了其 suid 属性。

int issuid(file *f){
 ...
}

我最好的选择是查看 inode 结构,我在其中进行了搜索(但未成功),但将 inode 视为物理磁盘上文件的内存表示,并考虑一些文件系统没有 Unix 风格的文件权限,我仍然不确定我在寻找正确的方向。

【问题讨论】:

    标签: c linux-kernel suid


    【解决方案1】:

    我已经在正确的方向,但不知何故,我没有意识到这一点。

    inode 结构有一个字段:

    umode_t                     i_mode;
    

    代表文件权限。

    include/uapi/linux/stat.h文件中,你可以看到文件的权限从一开始就开始了。

    #define S_IFMT  00170000
    #define S_IFSOCK 0140000
    #define S_IFLNK  0120000
    #define S_IFREG  0100000
    #define S_IFBLK  0060000
    #define S_IFDIR  0040000
    #define S_IFCHR  0020000
    #define S_IFIFO  0010000
    #define S_ISUID  0004000
    #define S_ISGID  0002000
    #define S_ISVTX  0001000
    
    #define S_ISLNK(m)  (((m) & S_IFMT) == S_IFLNK)
    #define S_ISREG(m)  (((m) & S_IFMT) == S_IFREG)
    #define S_ISDIR(m)  (((m) & S_IFMT) == S_IFDIR)
    #define S_ISCHR(m)  (((m) & S_IFMT) == S_IFCHR)
    #define S_ISBLK(m)  (((m) & S_IFMT) == S_IFBLK)
    #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
    #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
    
    #define S_IRWXU 00700
    #define S_IRUSR 00400
    #define S_IWUSR 00200
    #define S_IXUSR 00100
    
    #define S_IRWXG 00070
    #define S_IRGRP 00040
    #define S_IWGRP 00020
    #define S_IXGRP 00010
    
    #define S_IRWXO 00007
    #define S_IROTH 00004
    #define S_IWOTH 00002
    #define S_IXOTH 00001
    

    我希望这个答案对像我这样看不到明显事实的人有用。

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 2014-06-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 2017-07-29
      相关资源
      最近更新 更多