被篡改的daemon

简介: 大家好,今天跟大家分享一例有趣的问题。问题的有趣之处,在于它稍微有点曲折。处理这类问题,我们需要不断的提出一个个小的问题,然后通过解决这些小问题,最后解决原本的问题。


问题现象

ECS服务器的CPU总是被init用掉30%左右,而且可以看到整个系统的sy占比相当之高。

问题处理过程

init进程在做什么?

首先,init进程作为Linux系统所有进程的父进程,负责系统的启动过程。这个进程使用CPU资源,我们第一个需要问自己的问题是,这个进程到底在做什么。

使用strace可以挂到正在运行的进程上,追踪进程的系统调用。通过阅读进程的系统调用,我们大概可以估计一下进程的行为。具体到这个问题,在strace日志中,会发现大量的进程退出的记录。下边是用SIGCHLD信号过滤过的strace日志。在这个截图里,我们可以看到,在一秒时间内,就有大量的进程退出。CLD_EXITED说明子进程退出。这绝对是一个非常不正常的状况。如此行为必然消耗大量CPU资源。

这些进程到底是什么?

知道init在不断的启停大量进程之后,我们自然而然的会问自己,这些进程到底是什么。找出这个问题的答案的方法可能有很多种,但是这里我用到了一种比较简单的方法,叫做auditing,简单点说,就是审计和记录系统一些关键操作。

我们开启audit之后,会在/var/log/audit/目录里快速生成很多日志文件,通过分析和过滤,发现大量被启停的进程是atd。syscall=2对应fork系统调用。

另外用ls命令不断的刷新/proc目录,我们也可以看到进程短时间被大量启停的迹象。

atd被不断的启停导致init使用CPU高?

目前我们知道了,init进程在不断的atd进程,基本上我们已经有了一个阶段性的结论。我们简单验证一下这个结论。

把/usr/bin/atd重命名为/usr/bin/atd.backup,重启系统,问题不再发生。

为什么atd被不断的启停?

init启动atd的基本方式是,如果atd退出,那么atd会被重启。这个可以在atd.conf文件中看到。所以开始猜测的情况是,因为atd不正常退出,所以被init重复启动。所以方向放在了调试atd非正常退出上。结果用strace追踪,并没有发现太多有用的信息。最后我把方向转向了ltrace。用ltrace追踪atd的启动过程,我发现这个进程会fork一个子进程,然后这个子进程又会重复父进程的行为,直到无穷。这是一个非常有趣的现象。

atd的bug?

这个时候,很自然的,我会认为这是atd的一个bug,而这个bug在客户机器环境中被触发出来。

但是这个时候我发现另外一个不和逻辑的地方,我明明把atd重命名为atd.backup,但是机器重启之后,依然有atd这个进程存在,而且CPU问题不在了!

顺手用which命令查了一下atd,发现这次正在运行的atd命令是usr/sbin/atd,而不是/usr/bin/atd。这两个文件大小完全不同。

root@iZ2ze322qa55cmibwpd2zeZ:~# ls -al /usr/bin/atd.backup
-rwx--x--x 1 root root 2443616 Feb 20 2017 /usr/bin/atd.backup
root@iZ2ze322qa55cmibwpd2zeZ:~# ls -al /usr/sbin/atd
-rwxr-xr-x 1 root root 22544 Oct 21 2013 /usr/sbin/atd

而且/usr/bin/atd这个文件,并属于at这个package。

root@iZ2ze322qa55cmibwpd2zeZ:~# dpkg -L at
/.
/lib
/lib/systemd
/lib/systemd/system
/lib/systemd/system/atd.service
/usr
/usr/share
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/atd.8.gz
/usr/share/man/man5
/usr/share/man/man5/at.allow.5.gz
/usr/share/man/man1
/usr/share/man/man1/at.1.gz
/usr/share/doc
/usr/share/doc/at
/usr/share/doc/at/README
/usr/share/doc/at/copyright
/usr/share/doc/at/Problems
/usr/share/doc/at/changelog.Debian.gz
/usr/share/doc/at/timespec
/usr/sbin
/usr/sbin/atd
/usr/bin
/usr/bin/at
/usr/bin/batch
/etc
/etc/init.d
/etc/init.d/atd
/etc/at.deny
/etc/pam.d
/etc/pam.d/atd
/etc/init
/etc/init/atd.conf
/var
/var/spool
/var/spool/cron
/var/spool/cron/atjobs
/var/spool/cron/atspool
/usr/share/man/man5/at.deny.5.gz
/usr/share/man/man1/atrm.1.gz
/usr/share/man/man1/batch.1.gz
/usr/share/man/man1/atq.1.gz
/usr/bin/atq
/usr/bin/atrm

结论&建议

目前这种状况,建议重新安装系统,同时可以请安全团队进一步核实这个文件的来源。

目录
相关文章
|
2月前
|
SQL 算法 关系型数据库
【MySQL】MVCC多版本并发控制:核心原理、Read View、undo log版本链、RC/RR隔离级别的差异控制(附《高频面试题》+流程图)
MySQL MVCC是InnoDB实现高并发的核心机制,通过undo log版本链与Read View可见性判断,使读不加锁、读写互不阻塞。它支撑RC(每次查询新建Read View)和RR(事务首次查询创建并复用Read View)隔离级别,在解决不可重复读与幻读的同时,兼顾性能与一致性。
|
5月前
|
算法 数据挖掘 测试技术
大模型应用:向量数据库智能化索引优化:基于数据特征的最优算法自适应选择.32
本文介绍向量数据库的智能化索引优化方案:通过自动分析向量数据的维度、规模、分布与稀疏性四大特征,结合专家规则与轻量模型,动态匹配最优索引算法(如HNSW、IVF-PQ等),并经基准测试验证召回率、QPS与延迟,实现“分析—匹配—验证—部署”闭环,显著降低人工调参成本。
412 3
|
JavaScript 关系型数据库 MySQL
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
435 0
|
Web App开发 JavaScript 前端开发
鸿蒙Flutter实战:04-如何使用DevTools调试Webview
本文介绍如何在鸿蒙 Flutter 开发中调试 Webview,包括配置允许调试、找到 devtools 端口、开启端口转发、在 Chrome 中调试 Webview等。
970 0
鸿蒙Flutter实战:04-如何使用DevTools调试Webview
|
SQL 存储 缓存
Apache Calcite 框架 50 倍性能优化实践
某天临时被当成壮丁拉去参加一个非常牛逼的应用监控平台(后续会开源),然后大佬就给我派了一个任务,要将项目中的查询性能优化 50 倍以上,大佬对我如此地寄予厚望,我怎么能让大佬失望呢(虽然我内心瑟瑟发抖)?于是我就开始了这段性能优化之旅。
2132 0
Apache Calcite 框架 50 倍性能优化实践
|
存储 安全 前端开发
在前端开发中需要考虑的常见web安全问题和攻击原理以及防范措施
在前端开发中需要考虑的常见web安全问题和攻击原理以及防范措施
1979 0
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
1258 5
|
缓存 JavaScript 容器
vue动态组件化原理
【9月更文挑战第2天】vue动态组件化原理
417 3
|
机器人 Android开发 开发者
视频号不入镜自动开播的机器人真的来啦
视频号不入镜自动开播的机器人真的来啦
688 2
|
存储 API 开发工具
对象存储oss使用问题之操作报错:The request signature we calculated does not match the signature you provide如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
5214 0