通常黑客在获得系统的root权限后,都要在系统上留下一定的后门,以备再次登陆之便。后门的留法可谓多种多样,但是多数都是采用替换系统配置文件,或者是其它二进制可执行文件的方法来实现。以往的做法是在做完系统后,对系统安全相关的配置文件和可执行文件进行校验,生成校验码,保存下来,在以后的系统检察中,查看文件的校验码是否改变,如果发生改变,则可以认为系统已被攻破,不再可信,需要恢复!这确实能够达到目的,但是这种做法欠实时性,并且效率较为低下。Linux系统的2.6.13以上内核为我们提供了另一种监视文件系统变化的途径,它就是inotify机制!
inotify机制是由著名开源桌面搜索首先引入的,因为PC环境中较少有文件系统的变化,并且没有必要为每次文件系统的变化都重建索引,那样做效率是及其低下的,事实上,我们只需要重建更改部分的索引就行了。所以inotify就诞生了。inotify以前曾用设备文件的方式实现内核和用户空间的通信,现在改成了系统调用并且被官方内核采纳。
inotify提供的系统调用接口很是简便,总共只有三个:
int inotify_init (void); /*初始化inotify */
int inotify_add_watch (int __fd, const char *__name, uint32_t __mask); /* 将文件__name加入监视列表,成功后返回监视描述符 */
int inotify_rm_watch (int __fd, uint32_t __wd); /* 将__wd所指的文件从监视列表中剔除 */
之后就可以用系统调用read从描述符fd中读取inotify_event结构了。因为它是文件描述符,所以select和poll仍然有效。
/* Structure describing an inotify event. */
struct inotify_event
{
int wd; /* Watch descriptor. */
uint32_t mask; /* Watch mask. */
uint32_t cookie; /* Cookie to synchronize two events. */
uint32_t len; /* Length (including NULs) of name. */
char name __flexarr; /* Name. */
};
注意:name是个可变长度的数组,最小为零,长度由len给出,包含了结尾符'\n',name只是相对于监视路径的
相对文件路径,所以发生在被监视文件上的操作name字段长度为0!
inotify能监视的事件目前有:
#define IN_ACCESS 0x00000001 /* File was accessed. */
#define IN_MODIFY 0x00000002 /* File was modified. */
#define IN_ATTRIB 0x00000004 /* Metadata changed. */
#define IN_CLOSE_WRITE 0x00000008 /* Writtable file was closed. */
#define IN_CLOSE_NOWRITE 0x00000010 /* Unwrittable file closed. */
#define IN_CLOSE (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* Close. */
#define IN_OPEN 0x00000020 /* File was opened. */
#define IN_MOVED_FROM 0x00000040 /* File was moved from X. */
#define IN_MOVED_TO 0x00000080 /* File was moved to Y. */
#define IN_MOVE (IN_MOVED_FROM | IN_MOVED_TO) /* Moves. */
#define IN_CREATE 0x00000100 /* Subfile was created. */
#define IN_DELETE 0x00000200 /* Subfile was deleted. */
#define IN_DELETE_SELF 0x00000400 /* Self was deleted. */
#define IN_MOVE_SELF 0x00000800 /* Self was moved. */
/* Events sent by the kernel. */
#define IN_UNMOUNT 0x00002000 /* Backing fs was unmounted. */
#define IN_Q_OVERFLOW 0x00004000 /* Event queued overflowed. */
#define IN_IGNORED 0x00008000 /* File was ignored. */
/* Special flags. */
#define IN_ISDIR 0x40000000 /* Event occurred against dir. */
#define IN_ONESHOT 0x80000000 /* Only send event once. */
有一点需要指名,有的文档将IN_DELETE_SELF和IN_MOVE_SELF错误理解为一个可执行程序将自己删除和移动,正确的解释应该是加入监视列表中的某个文件或者目录被删除,或者是被移动,并且移动之后这个文件仍在监视范围之内,直到它被删除。
我写了一个简单的示例程序,用来监视系统内重要系统文件改变,详见附件!
附件:
参考链接:
http://www-128.ibm.com/developerworks/linux/library/l-inotify.html
阅读(1167) | 评论(0) | 转发(0) |