chkrootkit 扫描仪检测到可能的 KLM 木马病毒

chkrootkit 扫描仪检测到可能的 KLM 木马病毒

今天我使用该chkrootkit工具扫描了我的计算机,运行如下命令:

sudo chkrootkit

以下是部分输出:

正在检查 `lkm'... 您有
2 个隐藏的 readdir 命令进程 您有 2 个隐藏的 ps 命令进程 chkproc: 警告:可能安装了 LKM 木马 chkdirs: 未检测到任何内容

这有什么可担心的吗?如果是的话,我该如何补救呢?

我正在运行 Ubuntu 14.10 和chkrootkit版本 0.49。

答案1

这有什么可担心的吗?

不,这是误报,也是 chrootkit 中长期存在的错误。每当 lkm 检查报告 readdir 命令无法访问的隐藏进程时,您都会看到此消息。如果您正在运行 ClamAV、MySQL、Exim 或 MailScanner 之类的程序,您一定会看到此警告。

最简单的检查:运行 chrootkit 几次,并停止尽可能多的服务(例如 mysql、clamav 等)。如果结果不同,则明确表明这是误报。

顺便说一句:rkhunter 对 lkm 有更好的检查。


关于此消息的一些随机主题:stackchangecpanel网站Linux问题网站所有人都说这是假的,是一个错误。


额外的内容:该命令./chkproc -v将显示您收到的消息的进程 ID (PID),您可以使用它来查找与此进程连接的程序cd /proc/{PID}/ && cat cmdline

如果这足够有说服力,你可以停止阅读。如果你想了解你的机器和它的工作原理,请继续阅读。


那么,为了解决这个问题,您需要了解有关系统哪些知识?

首先:最好的 rootkit 检测器就是你自己。了解你的机器上有哪些服务处于活动状态,了解你的机器上运行着哪些脚本,这些才能让你的系统保持干净和安全。当然,要完全理解 Linux 系统需要一些时间。

第二:有一些恶意软件针对 Linux但这种情况很少见。原因很简单,尽管 Linux 非常易于移植,但移植性并不强。发行版(无论多么小)、库、不同内核和编译器之间的差异使得在随机机器上执行随机代码变得极其困难。而那些沉迷于恶意软件的人是为了经济利益。所以他们专注于 Windows,原因很简单,它是闭源的,有很多漏洞需要微软采取行动来修复。(简化:))


现在,您会看到有关可能已安装 LKM 木马的警告。LKM 代表 Linux 内核模块,是 Linux 的核心模块之一。内核模块被加载到匹配的内核中,如果两者不属于同一类,则模块不会加载。这是 Linux 系统的基本安全功能之一,您可以使用它来追踪恶意代码 (1)。

关于内核的一些基本知识(2):

  • uname -r显示你的内核。

  • 您可以在 中查看已安装的内核/boot

    rinzwind@schijfwereld:/boot$ ls abi-3.16.0-22-generic initrd.img-3.16.0-29-generic abi-3.16.0-23-generic initrd.img-3.16.0-30-generic abi-3.16.0-24-generic memtest86+.bin abi-3.16.0-25-generic memtest86+.elf abi-3.16.0-28-generic memtest86+_multiboot.bin abi-3.16.0-29-generic System.map-3.16.0-22-generic abi-3.16.0-30-generic System.map-3.16.0-23-generic config-3.16.0-22-generic System.map-3.16.0-24-generic config-3.16.0-23-generic System.map-3.16.0-25-generic config-3.16.0-24-generic System.map-3.16.0-28-generic config-3.16.0-25-generic System.map-3.16.0-29-generic config-3.16.0-28-generic System.map-3.16.0-30-generic config-3.16.0-29-generic vmlinuz-3.16.0-22-generic config-3.16.0-30-generic vmlinuz-3.16.0-23-generic grub vmlinuz-3.16.0-24-generic initrd.img-3.16.0-22-generic vmlinuz-3.16.0-25-generic initrd.img-3.16.0-23-generic vmlinuz-3.16.0-28-generic initrd.img-3.16.0-24-generic vmlinuz-3.16.0-29-generic initrd.img-3.16.0-25-generic vmlinuz-3.16.0-30-generic initrd.img-3.16.0-28-generic

  • 内核模块安装在/lib/modules与您的内核匹配的子目录中。


因此,基于 (1) 和 (2),下一步是重新启动进入另一个内核。有问题的模块是针对特定内核编译的,无法将其自身编译进入另一个内核(只是因为标头不匹配)。


拥有 rootkit 后,受影响的目录和文件数量有限(rootkit 需要从某个地方启动)。有 2 个目录和一组文件将成为目标...

  1. /etc/init.d/

    执行ls -ltr /etc/init.d(它将按最后更改的顺序列出它们)并检查未知服务。正常服务将具有合理的名称。这些服务可以由系统启动或手动启动。

    rinzwind@schijfwereld:/etc/init.d$ ls acpid hwclock.sh reboot alsa-utils irqbalance resolvconf anacron kerneloops rsync apparmor killprocs rsyslog apport kmod saned atieventsd lightdm sendsigs avahi-daemon lvm2 single bluetooth mountall-bootclean.sh skeleton bootmisc.sh mountall.sh smartmontools brltty mountdevsubfs.sh speech-dispatcher cgmanager mountkernfs.sh sslh cgproxy mountnfs-bootclean.sh sudo checkfs.sh mountnfs.sh thermald checkroot-bootclean.sh networking udev checkroot.sh network-manager udev-finish console-setup ondemand ufw cron php5-fpm umountfs cups pppd-dns umountnfs.sh cups-browsed procps umountroot dbus pulseaudio unattended-upgrades dns-clean rc urandom grub-common rc.local uuidd halt rcS x11-common hostname.sh README

  2. /etc/rc*/

    启动和终止脚本位于/etc/rc[0-5,S].d。通常,这里的文件有编号和合理的描述(这些文件在启动时按字母顺序执行,在终止时按相反顺序执行。注意由随机数字和字母组成的脚本。这是一个列表(这些是有效脚本)。

    rinzwind@schijfwereld:/etc$ ls rc*/ rc0.d/: K01alsa-utils K01lightdm K01unattended-upgrades K05umountnfs.sh K01atieventsd K01php5-fpm K01urandom K06networking K01bluetooth K01pulseaudio K01uuidd K07umountfs K01cgmanager K01resolvconf K02avahi-daemon K08umountroot K01cgproxy K01speech-dispatcher K03sendsigs K09halt K01cups-browsed K01sslh K04rsyslog README K01irqbalance K01thermald K05hwclock.sh

    rc1.d/: K01alsa-utils K01irqbalance K01speech-dispatcher README K01atieventsd K01kerneloops K01sslh S01dns-clean K01bluetooth K01lightdm K01thermald S01killprocs K01cgmanager K01php5-fpm K01ufw S01pppd-dns K01cgproxy K01pulseaudio K01uuidd S02single K01cups K01saned K02avahi-daemon K01cups-browsed K01smartmontools K04rsyslog

    rc2.d/: README S01uuidd S02kerneloops S04cups S01apport S02acpid S02rsync S04cups-browsed S01cgmanager S02anacron S02smartmontools S04pulseaudio S01dns-clean S02atieventsd S02speech-dispatcher S04saned S01php5-fpm S02cgproxy S02thermald S05grub-common S01pppd-dns S02cron S03avahi-daemon S05ondemand S01rsyslog S02dbus S03bluetooth S05rc.local S01sslh S02irqbalance S03lightdm

    rc3.d/: README S01uuidd S02kerneloops S04cups S01apport S02acpid S02rsync S04cups-browsed S01cgmanager S02anacron S02smartmontools S04pulseaudio S01dns-clean S02atieventsd S02speech-dispatcher S04saned S01php5-fpm S02cgproxy S02thermald S05grub-common S01pppd-dns S02cron S03avahi-daemon S05ondemand S01rsyslog S02dbus S03bluetooth S05rc.local S01sslh S02irqbalance S03lightdm

    rc4.d/: README S01uuidd S02kerneloops S04cups S01apport S02acpid S02rsync S04cups-browsed S01cgmanager S02anacron S02smartmontools S04pulseaudio S01dns-clean S02atieventsd S02speech-dispatcher S04saned S01php5-fpm S02cgproxy S02thermald S05grub-common S01pppd-dns S02cron S03avahi-daemon S05ondemand S01rsyslog S02dbus S03bluetooth S05rc.local S01sslh S02irqbalance S03lightdm

    rc5.d/: README S01uuidd S02kerneloops S04cups S01apport S02acpid S02rsync S04cups-browsed S01cgmanager S02anacron S02smartmontools S04pulseaudio S01dns-clean S02atieventsd S02speech-dispatcher S04saned S01php5-fpm S02cgproxy S02thermald S05grub-common S01pppd-dns S02cron S03avahi-daemon S05ondemand S01rsyslog S02dbus S03bluetooth S05rc.local S01sslh S02irqbalance S03lightdm

    rc6.d/: K01alsa-utils K01lightdm K01unattended-upgrades K05umountnfs.sh K01atieventsd K01php5-fpm K01urandom K06networking K01bluetooth K01pulseaudio K01uuidd K07umountfs K01cgmanager K01resolvconf K02avahi-daemon K08umountroot K01cgproxy K01speech-dispatcher K03sendsigs K09reboot K01cups-browsed K01sslh K04rsyslog README K01irqbalance K01thermald K05hwclock.sh

    rcS.d/: README S03udev S08checkroot-bootclean.sh S01console-setup S04brltty S08kmod S02alsa-utils S04mountdevsubfs.sh S08urandom S02apparmor S04procps S09mountall.sh S02hostname.sh S04udev-finish S09networking S02mountkernfs.sh S05hwclock.sh S10mountall-bootclean.sh S02resolvconf S05lvm2 S10mountnfs.sh S02ufw S06checkroot.sh S11mountnfs-bootclean.sh S02x11-common S07checkfs.sh S12bootmisc.sh

  3. 启动脚本。

    通常,Ubuntu 在终端中使用 bash,并在启动时使用 dash。echo $SHELL将显示正在使用的 shell。对于 bash,要检查是否存在奇怪脚本或奇怪代码行的隐藏文件是...

    /etc/profile 
    /etc/bashrc
    /etc/bash.bashrc
    
    ~/.profile
    ~/.bash_profile
    

    这些是 5 个常见的。任何机器都可以有更多。除此之外,你还可以包括

    /etc/crontab
    crontab
    

    最后一个适用于您的用户,通过执行sudo su。您可以使用“crontab”列出crontab -l。注意非通用 Linux 或由您创建的脚本。

如果您碰巧有第二个系统,生活就会变得容易得多:您可以简单地将上述所有文件与第二台机器进行比较。

答案2

我知道已经有了一个可接受的答案,但我想展示另一种调试方法,这可能会在将来帮助其他人。这帮助我弄清楚这确实是误报。我还在使用chkrootkitv0.53的 Ubuntu 20.04 上偶然发现了这样的输出

Checking `lkm'...                                           You have    12 process hidden for readdir command
You have    12 process hidden for ps command
chkproc: Warning: Possible LKM Trojan installed

12请注意,每次运行时,的数量都会发生变化。因此,为了进一步调试,我运行了chkproc -v(通常在/usr/lib/chkrootkit/),输出如下:

PID 277881(/proc/277881): not in readdir output
PID 277881: not in ps output
You have     1 process hidden for readdir command
You have     1 process hidden for ps command

请注意,每次我运行它时,它也会发生变化(不同的 PID,不同的数量)。因此,似乎某些(未识别的)短暂进程正在干扰chkproc,这是已知的误报来源,请参阅http://www.chkrootkit.org/faq/。为了做出最终判断,我需要识别这些短暂的进程,为此我只能建议使用atop,它可以跟踪一段时间内的进程历史,这样它就可以告诉您哪些进程在一段时间内处于活动状态。

因此,要调试所有这些,您需要执行以下操作:

  1. 在一个 shell 中运行chkproc -v,然后atop在另一个 shell 中运行。
  2. chkproc返回一些 PID 时,等待atop更新其输出然后暂停它(通常z是键)。
  3. 查看atop输出的下半部分,您将在其中找到进程列表,从当前活动的进程开始,到过去记录期间已退出的进程结束。此类进程将在最右侧列中用atop标记。<>
  4. 尝试找到您刚刚在步骤 1 中看到的 PID。chkproc -v如果它不在那里,那么您可能暂停得atop太早了,所以在这种情况下请重试。如果您能找到 PID,请查看其CMDRUID条目。这应该会给您一个很好的提示,这个进程曾是并且希望能够让您了解这是否是误报。

最后,我要说的是,我发现了很多这样的短暂进程(例如很多sleep),它们原来是来自我系统上运行 Web 应用程序的 Docker 容器。为了验证这一点,我暂时停止了所有 Docker 容器,所有这些短暂进程都消失了,而且chkprocchkrootkit再次高兴地发现什么也没有。

总结一下:Docker 容器中的短命进程可能会导致误报。不过,一定要先识别它们,而不是立即忽略它们。

相关内容