五.后语 冰块 这篇文章的整个补丁代码我没有找到,可能是因为这个人关于这个东西的开发已经放弃了吧。呵呵,,如果谁能找到。请告诉大家,原来他们提供的url是: 这篇文章和以前发表的LIDS文章都是关于内核模块级的系统安全的。这篇主要是对缓冲区溢出的漏洞进行防范。虽然没有代码的原形,但是它给出的几个代码事例能够帮助我们更好的理解Linux的内核模块如何截获系统调用,或是如何对进程运行权分析的实现。对于我们理解Linux和其他操作系统的内核有一定的帮助。希望大家能通过这篇文章能多提高点理解认识,对以后自己开发系统安全软件能有一定理论上的帮助作用。下面是check_rootproc函数的代码: /*check_rootproc.c*/ int check_rootproc(struct inode *ino){ int cont=0,iproc=0,error=0; suidp_t * suidproc; efile_t f; suidp_t p; if ((IS_SETUID_TO_ROOT(current))||(IS_A_ROOT_DAEMON(current))) { for (;conti_dev&& permitted.lst[cont].efid.inode==ino->i_ino)){ if ((permitted.lst[cont].efid.size==ino->i_size)&& permitted.lst[cont].efid.modif==ino->i_mtime)){ suidproc=permitted.lst[cont].processes; for(iproc=1;iprocsuidp_id.comm,current->comm)){ suidproc->suidp_id.count++; return PSA; } if (iprocnext; } } }else{ error=EFNA; goto file_exe_unauthorized; } } } error=EXENA;/*EXE is not in the database*/ goto file_exe_unauthorized; } return PNS;/*the process is not setuid to root or root daemon*/ file_exe_unauthorized: f.efid.device=ino->i_dev; f.efid.inode=ino->i_ino; f.efid.size=ino->i_size; f.efid.modif=ino->i_mtime; strncpy(p.suidp_id.comm,current->comm, sizeof(p.suidp_id.comm)); p.suidp_id.count=1; do{ while(writer_pid!=0){ cli();/*interrupt disabled*/ if (writer_pid!=0) interruptible_sleep_on(&pid_queue); sti(); } } while(!atomic_access(&writer_pid,current->pid)); /*start of critical section*/ do_setuid_put(&(f.efid),&(p.suidp_id),FAILURE); writer_pid=0;/*end of critical section*/ atomic_access(&writer_pid,0);/*release of the lock*/ return error; }有多远,走多远,把足迹连成生命线。