近日遇到一个问题,zStorage 的 FrontEnd
PART1:排查过程
首先能想到的是,FE 是否启动了 8 个轮询线程,是否工作在轮询模式下。通过检查配置文件,确认 FE 绑定了 8 个 CPU 核心,并且 8 个轮询线程也已正常启动,并运行在不同的 CPU 核心上。

如图所示,FE 一共启动了 8 个 Reactor,每个 Reactor 是一个系统线程,绑定于指定的 CPU 核心上。例如,reactor_24 绑定于 24 号 CPU 核心,reactor_26 绑定于 26 号 CPU 核心。但是,每个 Reactor 仅占用了 8.3% 的 CPU,这非常反常。
那么,会不会是因为新修改的代码调用了阻塞性的函数,例如 read、sleep 等呢?使用 strace

通过对比正常节点 FE 的 strace 信息和异常节点 FE 的信息,发现二者没有任何区别。并且,从修改的代码来看,也并未引入阻塞性的操作。因此,继续转向其他排查思路。
针对 Reactor_24 运行在 24 号核心上,24 号核心到底每秒钟执行了多少时钟周期呢?(图中用的是 72 号核心,由于当时没有截图,这里是重新补的图。)

如图所示,每秒有 2.4G 个时钟周期。如果每秒跑 2.4G 个周期,这个 CPU 核应该是已经跑满到 100% 了。那么,为什么 FE 显示只占用了 8% 的 CPU 呢?难道是显示错误?
接着用 perf stat,指定 FE 的进程 ID 再抓一次,确实显示时钟周期很少。FE 并未执行到 2.4G 个周期,CPU 占用率只有 8%,这也就说得通了。
使用 spdk_top
再次打开 top 工具,按下 1 键,显示了每个 CPU 核心的使用率。可见,24 号核心的使用率确实是 100%。到底是被谁占用了呢?

好吧,先避开这些异常的 CPU 核心,将 FE 绑定到其他的 CPU 核心上,然后重新启动。通过 htop

那么这些异常的 CPU 是被谁占用的呢?再看一眼之前的 top 信息,确实总的 CPU 占用率达到了 38.3%。这条服务器上一共有 96 个核心,那么相当于有 36 个 CPU 核心是 100% 的使用率。但是从进程占用率来看,远远达不到。

事出反常必有妖。难道是中毒了,被挖矿了?
PART2:拓展分析
网上搜了下挖矿病毒的相关资料,找到了一个名为 libprocesshider.so
那么这个动态库是怎么运行起来的呢?查看 /etc/ld.so.preload,发现正是 /usr/local/lib/libprocesshider.so。有了这个配置以后,在启动一个进程的时候,就可以预先将 libprocesshider.so 加载到进程中。
那么,尝试删除 /etc/ld.so.preload 试试,top 现在无法再访问 /etc/ld.so.preload,隐藏的占用 CPU 的进程应该显形了。


继续分析,这个动态库是怎么达到隐藏的目的呢?继续搜索,居然发现这个是个开源代码。看来人家本身不是病毒,只是一把刀,至于这把刀怎么用,那人家可不管。

实际上,很简单。这个动态库实现了一个 readdir 函数。由于启动进程时会预先加载这个库,因此当程序调用 readdir 时,实际上会先调用这里的 readdir 函数。只需要在这个函数里过滤掉病毒程序(.N5OYV5U)就好了。这样,当我们打开 top 的时候,top 程序会去 /proc 目录读取进程的 CPU 占用信息,但被过滤掉后就不会显示出来了。

网上查询到的信息又说可以检查下异常的网络连接。果然有可疑的网络连接,而且还是个外国货。


结局
原因知道了,但是把病毒文件删除以后,一会又出来了。就没有再继续分析了,效率至上,直接重装了系统解决问题。
作者
云和恩墨 分布式存储开发工程师 张洋




