|
在使用宝塔 Linux 面板时发现一个可能导致 Nginx 虚拟主机配置文件被自动删除的问题,已经通过 Linux auditd 定位到具体代码。 我的站点配置文件: /www/server/panel/vhost/nginx/example.cn.conf会在宝塔面板 reload 后被自动删除。 auditd 记录到实际删除时间为: 2026-08-17 16:11:03删除进程为: exe="/www/server/panel/pyenv/bin/python3.7"COMMAND:/www/server/panel/pyenv/bin/python3 /www/server/panel/class/jobs.py系统调用为: SYSCALL=unlinksuccess=yes被删除文件: /www/server/panel/vhost/nginx/example.cn.conf继续检查 /www/server/panel/class/jobs.py 后,发现 clear_other_conf() 中存在以下代码: def clear_other_conf(): path = '/www/server/panel/vhost/nginx' ... conf_body = public.readFile(filename) if not conf_body: continue if conf_body.find('body_filter_by_lua_block') != -1 and conf_body.find('</head') and conf_body.find('<scrip'): is_reload = True os.remove(filename)这里后两个 find() 判断疑似存在逻辑错误。 Python str.find() 在字符串不存在时返回 -1,而: bool(-1) == True所以假设一个正常 Nginx 配置中: body_filter_by_lua_block -> find = 5525</head -> find = -1<scrip -> find = -1当前条件实际上仍会被判断为 True: True and bool(-1) and bool(-1)最终执行: os.remove(filename)导致整个正常的 Nginx vhost 配置被删除。 我的 body_filter_by_lua_block 是正常的 OpenResty/Nginx Lua 配置,用于处理退出登录后的 HTTP 响应,并不存在 HTML 注入相关的 </head> 或 <script> 内容。 我认为这里原本预期的判断可能应该是: if ( conf_body.find('body_filter_by_lua_block') != -1 and conf_body.find('</head') != -1 and conf_body.find('<scrip') != -1):或直接使用: if ( 'body_filter_by_lua_block' in conf_body and '</head' in conf_body and '<scrip' in conf_body):目前我的临时处理方式是移除站点配置中的 body_filter_by_lua_block,保留其他 Lua 功能,从而避免触发该清理逻辑。 希望官方确认一下 clear_other_conf() 这里的判断是否为 Bug。如果属实,建议尽快修复,因为当前逻辑可能误删用户合法的 Nginx/OpenResty 配置文件,而且删除的是整个 .conf 文件,不只是相关配置段。
|