当前位置:论坛首页 > BUG提交 > Linux面板

【已记录】Linux工具箱(linuxsys)插件升级致全系统segfault 3.8...

发表在 BUG提交前天 15:40 [复制链接] 2 31

【版本信息】
面板版本:宝塔 Linux 面板 13.0.0
插件版本:linuxsys(Linux 工具箱)2.8
系统版本:Debian GNU/Linux 12 (bookworm),内核 6.1.0-23-amd64
浏览器版本:宝塔桌面客户端 bt-client/1.2.6(Electron 21.4.4 / Chrome 106.0.5249.199)
说明:本次操作是通过宝塔桌面客户端在「软件商店」执行插件安装/升级,未使用浏览器。

【问题现象】
在软件商店对「Linux 工具箱(linuxsys)」执行安装/升级后,服务器上大量互不相关的进程开始持续异常终止,累计 38678 次,持续约 3 天(9 月 17 日 15:13 起,至 9 月 20 日服务器重启才停止)。

涉及进程与次数:
sshd:31613 次
udisksd:5799 次
cron:827 次
systemd:1 次

全部异常终止在完全相同的地址。内核日志中反复出现同一条记录:段错误发生在地址 e36,指令指针为 0000000000000e36,错误码 14。这个地址是一个很低的偏移量(0xe36 / 0xf30),不是正常的虚拟地址。

【根因】
linuxsys 插件安装脚本里的 install_cmd_audit 函数,用复制命令把插件自带的动态库文件直接写到系统库目录,而且是原地覆盖、非原子写入。

这个库通过系统的全局预加载配置(ld.so.preload)被引入,对系统上每一个新启动的进程都会生效。覆盖的那一瞬间,目标文件被截断,此期间启动的进程加载该库失败、但仍残留了映射记录(基址被当作 0),执行到线程局部存储相关路径时跳到了那个很低的偏移量,落进系统禁止映射的低地址区,必然触发段错误。

难点在于:只有新派生并重新执行的新进程才会重新走一遍动态库加载流程,长期驻留的父进程不受影响。因此服务状态检查、失败单元检查全程正常,系统完全不告警,运维极难发现。

【时间线证据】
14:41:35 面板接口:查询插件下载速度(plugin_name = linuxsys)
14:41:38 面板接口:执行插件安装(sName = linuxsys,version = 2,min_version = 8,upgrade = 2)
→ 插件目录修改时间变为 14:41
14:46:42 系统日志首次出现该动态库无法预加载(提示文件过短,已忽略)
15:13:33.212 该库文件修改时间
15:13:33.221 第一条 sshd 段错误(距文件写入仅 9 毫秒)

【重现方式】
面板已安装 linuxsys 插件,且已启用命令审计(全局预加载配置里存在该库文件)
在软件商店对 linuxsys 点击安装/升级
插件安装脚本执行复制,覆盖该库文件
覆盖窗口期内(或写入不完整时),新启动的任何进程加载该库即触发段错误
观察系统内核日志,出现上述相同地址的段错误,进程名各不相同

【建议修复】
采用原子替换,避免原地覆盖:先写入临时文件,再用重命名的方式替换目标文件
幂等判断:目标文件已存在、且校验值(sha256)与源文件一致时直接跳过,不做覆盖
写入前后校验 sha256,不一致则回滚
更新全局预加载库之前,先临时从预加载配置里摘除该行,更新完成后再写回,缩小影响面
该库一旦损坏就会导致全系统随机异常终止,且不产生任何告警,建议评估改用 auditd 等内核级方案,替代预加载方式

使用道具 举报 只看该作者 回复
发表于 昨天 11:37 | 显示全部楼层
您好,非常感谢反馈和支持!您的建议已收到并记录,后续会有相关人员进行修复
如果您还有更多问题和疑虑,您可以通过客服咨询宝塔面板相关问题,我们会安排专属的技术专家协助排查残留隐患:https://docs.bt.cn/wechat-service
操作方式:复制链接在微信打开,即可在线咨询客服。

使用道具 举报 回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

紧急运维服务

响应时间:3分钟

问题处理方式:宝塔专家1对1服务

工作时间:工作日:9:00 - 18:30

宝塔专业团队为您解决服务器疑难问题

点击联系技术分析

工作时间:09:00至18:30

快速回复 返回顶部 返回列表