四
進程是操作系統的動態入口
就象你可以看到是否有人要奪得root特權一樣
系統殺死進程的調用是kill
讓我們看看LIDS的保護代碼
在/usr/src/linux/kernel/signal
asmlinkage int
sys_kill(int pid
{
struct siginfo info;
#ifdef CONFIG_LIDS_INIT_CHILDREN_LOCK pid_t this_pid;
int i;
#ifdef CONFIG_LIDS_ALLOW_KILL_INIT_CHILDREN
if (!(current
#endif
if (lids_load && lids_local_load && LIDS_FISSET(lids_flags
this_pid = pid>
for(i=
if( this_pid == lids_protected_pid[i]) {
lids_security_alert(
return
}
}
}
#endif
}
你可以在內核裡看到兩個標簽
在CONFIG_LIDS_INIT_CHILDREN_LOCK的開啟狀態
另外一個保護進程的方法就是隱藏進程
如何隱藏進程
為了隱藏進程
當內核啟動的時候
在include/linux/sched
#ifdef CONFIG_LIDS_HIDE_PROC
#define PF_HIDDEN
#endif
/* in fs/lids
#ifdef CONFIG_LIDS_HIDE_PROC
struct allowed_ino proc_to_hide[LIDS_MAX_ALLOWED];
int last_hide=
#endif
/* in fs/lids
fill up the hidden process in proc_to_hide[]
*/
#ifdef CONFIG_LIDS_HIDE_PROC
lids_fill_table(proc_to_hide
#endif
PF_HIDDEN是否用戶可以用顯示進程的命令(如
在in fs/exec
int do_execve(char * filename
{
if (retval >=
#ifdef CONFIG_LIDS_HIDE_PROC
if (lids_search_proc_to_hide(dentry
current
因為每一個linux的進程都有一個在/proc文件系統的入口
在fs/proc/root
static struct dentry *proc_root_lookup(struct inode * dir
{
inode = NULL;
#ifdef CONFIG_LIDS_HIDE_PROC
if ( pid && p && (! ((p
#else
if (pid && p) {
#endif
unsigned long ino = (pid >>
inode = proc_get_inode(dir
if (!inode)
return ERR_PTR(
inode
}
}
然後如果進程被PF_HIDDEN標記
五
我們需要在系統啟動的時候做一些必要的操作
例如
為了密封內核
#lidsadm –I
它們可以放到腳本裡讓系統啟動的時候就執行它
當你密封了內核
#define LIDS_LOCKS
void lids_init(int optind
{
if ((fd=open(LIDS_LOCKS
perror(
exit_error (
}
if (read(fd
perror(
exit_error (
}
lids_set_caps(optind
locks
if (write(fd
perror(
exit_error (
}
}
這個系統調用在LIDS_LOCKS生成新的變量loks
讓我們看看lids_proc_locks_sysctl()
int lids_proc_locks_sysctl(ctl_table *table
void *buffer
{
/* first: check the terminal and the program which access the sysctl */
#ifndef CONFIG_LIDS_REMOTE_SWITCH
if (current
lids_security_alert(
write ?
return
}
#endif
/* second: check wether it is not a timeout period after two many failed attempts */
if (write) {
/* Third : check what is submitted (size
if (*lenp != sizeof(lids_locks_t)) {
lids_security_alert(
return
}
if (copy_from_user(&locks
return
if ((lids_first_time) && (!locks
number_failed=
if (lids_process_flags(locks
cap_bset=locks
From:http://tw.wingwit.com/Article/program/Oracle/201311/17154.html