LIDS精通与进阶(一)(4) dentry->d_inode->i_ino);..................... 这个是LIDS加到内核里做检测的一个例子。你会看到lids_check_base()是LIDS保护方法的一个核心函数。 你可以在LIDS要保护的地方看到很多LIDS保护方法用到lids_check_base()函数,特别是在linux内核的子目录下。 在/usr/src/linux/fs/lids.c int lids_check_base(struct dentry *base, int flag){ ..................inode = base->d_inode; /* get the inode number */parent = base->d_parent; /* get the parent diretory */................. ----> do { if ( inode == parent->d_inode) break; if ((retval = lids_search_inode(inode))) { if ( retval == LIDS_IGNORE (retval == LIDS_DEVICE && flag != LIDS_DEVICE)) break; if ( flag == LIDS_READONLY ( flag == LIDS_APPEND && retval >flag ) ( flag == LIDS_DEVICE && flag == retval )) { return -EROFS; } break; } inode = parent->d_inode; } while( ((parent = parent->d_parent ) != NULL) ); return 0; } lids_check_base()会检查一个给定文件的dentry和它的父目录是否被保护。 注意:如果它的父目录被保护,它下面的文件也会被保护。 例如,如果/etc/被保护,/etc/passwd也一样被保护。 (3)、在内核保护系统调用 为了保护系统,LIDS会在一些检查临界的系统调用的时候做检查。因此,我们可以保护系统调用和限制文件系统的用户调用。 这些是一些例子:
三、保护设备 Linux的设备会在/dev/目录下以文件的形式列出,我们可以用上面保护文件的方法来保护设备。但是在一些情况下,用户也可以用IO操作来旁路文件系统来读写设备,我们必须注意这个问题。 1、设备,内核I/O 在GNU/Linux系统下的设备会以文件的形式表达,所以我们可以用保护文件系统那样来保护设备。 用户的I/O访问是通过系统调用sys_operm和sys_iopl来实现的。你可以看看/usr/src/linux/arch/i386/kernel/ioport.。这个是要基于系统结构的,要是到其他平台,就需要注意它们的变化。 2、如何用LIDS来保护 大多数情况下,程序不需要通过在/dev的设备文件名称来访问设备。但是,一些特殊的程序需要直接访问,如X Server,这个会写到/dev/mem和甚至是I/O设备。我们需要一些额外的东西来保护设备。LIDS会在配置内核的时候来定义这个功能。