远程连接服务器失败:恶意进程利用 kswapd0 占用超高 CPU
文章目录
一、问题
在登录远程云服务器的时候,总是登录不上,断开连接,查询云服务器的监控显示 cpu 利用率有 99%甚至 100%,但服务器上没有运行什么程序。
二、检查
top 查看进程利用资源情况
等待很长时间,偶然登录上了云服务器,使用 top 指令查看:

发现是一个 kswapd0 的进程占用了高额的 cpu(几乎满了)。
查询发现,
kswapd0是Linux内核的交换守护进程,负责内存页面交换(swap)。高CPU占用通常表明系统物理内存不足,频繁触发内存换入换出(swap in/out)。
但本身没有运行什么程序,内存用光触发 kswapd0 就很可疑。
猜测可能是个披着外皮的恶意程序。
netstat 查看网络连接情况
查询情况如下:

kswapd0 是内核线程,理论上不应直接参与用户态的网络通信。
查看一下发起连接的 ip 来自哪里,如下图:

确认 PID 2757083 的真实身份
通过下面的指令,查看进程的可执行文件路径:
ls -l /proc/2757083/exe
如果输出指向 /usr/bin/redis-server、/usr/lib/systemd/systemd 或其他用户态程序,说明是工具显示错误了。如果指向内核文件(如 /boot/vmlinuz-*),则可能是内核线程的真实行为(但内核线程通常不建网络连接)。
结果如下:

/proc//exe 指向 /memfd:/ (deleted)
memfd 是 Linux 的一种特殊内存文件系统,允许在内存中创建匿名文件(不占用磁盘空间)。
(deleted) 表示该文件已被删除,但仍有进程在使用(通过文件描述符引用)。
PID 2757083 的进程的可执行文件指向一个被删除的 memfd 文件,这是非常可疑的!
正常情况,某些临时进程(如 systemd-journald 的辅助进程)可能使用 memfd,但通常会快速退出。
异常情况,恶意软件或漏洞利用可能通过 memfd 加载代码到内存,并删除磁盘上的原始文件以隐藏踪迹。
检查进程打开的文件和网络连接:
sudo lsof -p 2757083
查找是否有网络套接字(IPv4/IPv6)或异常文件打开。

memfd 文件使用
- txt 和多个 REG 文件指向 /memfd:/ (deleted):
- 恶意代码通过 memfd 加载到内存中运行,并删除了磁盘上的原始文件,以避免被检测。
- 多个 memfd 文件可能包含恶意代码的不同部分(如主程序、加密模块、配置等)。
网络连接
- 26u IPv4 … TCP VM-16-9-ubuntu:46970->134.209.226.248:8443 (ESTABLISHED):
- 进程建立了与 134.209.226.248:8443 的 TCP 连接,可能是恶意通信(如数据泄露、接收指令)。
使用 /tmp 目录:
- 进程的工作目录(cwd)为 /tmp,且打开了 /tmp/#119 (deleted) 文件(已删除但仍有进程在使用)。
- 攻击者可能利用 /tmp 存放临时文件或恶意脚本。
使用 eventpoll、eventfd、inotify:
这些是 Linux 的 I/O 多路复用和事件通知机制,恶意进程可能用于高效处理网络通信或监控文件系统变化。
猜测可能是由于Redis 服务存在漏洞,被攻击者利用执行恶意代码。
三、解决
使用 kill 指令杀死进程
sudo kill -9 2757083
杀死该进程后,cpu 利用率立即减少了。

使用 top 指令查看如下,也很正常了。

四、反思:修改 redis 的监听地址
可能是因为 redis 服务监听的地址为 0.0.0.0,同时云服务器上的防火墙对 redis 默认监听端口处于开放状态,所以被攻击了。
可以将 redis 的监听地址改一下:
1. 修改 Redis 配置文件
(1)找到 Redis 配置文件
通常位于 /etc/redis/redis.conf,可以通过以下命令确认:
sudo ps -aux | grep redis
查找类似 --config-file /etc/redis/redis.conf 的参数。
(2)编辑配置文件
使用文本编辑器(如 nano 或 vim)打开配置文件:
sudo nano /etc/redis/redis.conf
(3)修改 bind 配置项
找到 bind 配置项(通常在文件的 NETWORK 部分):
# 默认可能是:
# bind 127.0.0.1
# 或未设置(即监听所有接口)
# 修改为仅监听本地回环地址(推荐):
bind 127.0.0.1
# 如果需要监听特定内网 IP(如 10.0.16.9):
# bind 127.0.0.1 10.0.16.9
注意:
如果注释掉 bind(即 # bind 127.0.0.1),Redis 会监听所有接口,存在安全风险。
可以指定多个 IP,用空格分隔。
2. 重启 Redis 服务
修改配置后,重启 Redis 服务使配置生效:
sudo systemctl restart redis
检查 Redis 服务状态:
sudo systemctl status redis
确保状态为 active (running)。
最后,如果该文章对您有帮助,请给一个赞鼓励一下吧,谢谢!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)