结论先行:按文件查后门的思路,遇到一类攻击就会失效——它不写文件。后门被注入到 Web 中间件的内存里,磁盘上什么都不多,目录比对、新增文件巡检、webshell 特征串扫描全都不报警,而攻击者已经能通过一个普通 HTTP 请求执行命令。要发现它,观察点必须从「磁盘上有什么」换成「进程里有什么」:中间件注册了哪些过滤器和监听器、类加载有没有异常、访问日志里的请求与响应长度是否对得上。

为什么查文件查不到

传统后门是文件。有人往 Web 目录上传一个脚本,访问它就能执行命令。对应的检测手段也简单:监控目录变化、比对文件哈希、扫描脚本里的敏感函数。这套方法有效了十几年,因为后门必须有文件。

内存型后门把这个前提抽掉了。攻击者通过一个已有的漏洞,把一个恶意组件注册进正在运行的中间件进程中——它可能是动态注册的一个过滤器、一个 Servlet、一个监听器,也可能是被修改过的字节码。整个过程没有新文件落盘,所以文件层面的巡检看不见它。

还有一个特性让它在取证时更麻烦:这类组件活在进程内存里,服务重启就消失。这既是它的弱点,也是它最好的掩护——很多团队在发现异常后先做的就是重启服务「先恢复业务」,而这一步恰好把证据清掉了。

两种形态,处理方式不同

其一是文件型后门的变种。它确实有文件,但做了变形处理:编码、加密、拆分、或者藏在正常业务文件的尾部。这类后门靠特征串匹配容易被绕过,得靠语义分析——看这个文件里有没有把外部输入拼接进执行函数的路径。

其二是内存型后门。没有文件,只剩行为。它能被观察到的地方只有三个:进程内存里多出来的组件、中间件对外暴露的处理入口、以及它产生的访问记录。

两者的共同点在于:它们都要靠 Web 服务这个入口工作。这也决定了检测的主战场在中间件层,而不是文件系统层。

三类可观察信号

  • 中间件注册对象的变化。过滤器、Servlet、监听器的清单,在正常运行中是稳定的。清单里多出一个来源不明的组件,就是一个需要解释的信号。可以定期导出并与基线比对。
  • 进程与类加载的异常。内存中的类从哪来、由哪个类加载器加载、有没有在运行时被动态定义,这些在进程层面是可查的。对 Web 容器进程做定期的类清单快照,比事后翻日志有效得多。
  • 访问日志与响应的不一致。内存型后门通常通过一个特定参数或请求头触发。这类请求在访问日志里看起来像普通访问,但响应长度、状态码、耗时分布往往与同类页面不同。把「同一路径的响应长度分布」做成一个日常视图,异常会自己浮出来。

三类信号有一个共同前提:得有基线。没有正常运行时的组件清单与响应分布,就没有「异常」这个词。

重启不是处置

这是最需要提前定下的一条口径。服务重启之后,内存里的组件消失,业务恢复,表面上看问题解决了。但攻击者手里通常还留着最初的入口——那个没修的漏洞。重启只是让他需要再进来一次,而第二次进来会更快。

所以在应急处置的流程里,重启应当被归为「恢复业务」而不是「处置完成」。要做到这一点,得在事前把两件事说清楚:谁有权重启、重启前要留什么。前者是授权问题,后者是取证问题——内存镜像、进程的类清单、当时的访问日志,这三样在重启前采集,成本几分钟;重启后再想拿,就没有了。

企业侧该定的三件事

  1. 把 Web 中间件纳入资产台账的细粒度范围。只知道「有三十台服务器跑网站」不够;要知道每台跑的是什么中间件、什么版本、开了哪些管理端入口、目录里放了哪些应用。
  2. 定一条检测口径:文件层归谁看、行为层归谁看。文件巡检和入侵行为检测常常分属两拨人,中间那条缝恰好是内存型后门待的地方。
  3. 把「重启前取证」写进应急预案。一句话就够,但要在演练里真的做一遍,否则真出事的那天一定会忘。

在国产化环境里,这件事还要多一层确认:检测组件本身得能在这套系统与处理器架构上跑起来,且中间件版本支持。部分国产服务器操作系统已针对主流运维与安全组件做过兼容适配,但适配范围要提前确认,不能等到装机之后再现找办法。

边界与前提

三点说明。其一,本文只谈服务器侧内存型与非文件型后门的发现思路,不谈边界防护怎么布,也不谈终端侧的恶意代码检测。其二,文中涉及的检测能力描述为通用的技术路径,具体产品的检测范围与效果应以厂商资料与项目验证为准;任何能力声明都建议在自有环境中验证后再写进验收条件。其三,内存型后门的检测门槛高于文件型,它对人的要求比工具更高——需要有人能读懂中间件的注册机制与类加载过程。工具能给出线索,判断仍然在人。

深圳市奇摩计算机有限公司在做国产化终端与服务器侧的防护落地时,通常把「检测能力能否在这套系统上跑起来」和「出事时谁有权重启」这两件事一起确认,因为后者的答案决定了前者的证据还在不在。需要梳理服务器侧的检测覆盖与应急处置口径,欢迎 预约咨询。