文章总结: 本文系统分析Java内存马技术原理与研判方法。内存马通过动态类加载与反射注册技术驻留JVM内存,无文件落地且隐蔽性强,植入入口集中于反序列化、表达式注入等漏洞。文章详述Servlet、Filter、Spring框架、Agent等多种类型,提出先识别框架再定位类型的排查思路,借助Arthas等工具从MBean路由、类加载来源等维度交叉验证,清理遵循先取证后清理原则,并推荐多款开源查杀工具与RASP防护方案。
综合评分: 85
文章分类: 应急响应,恶意软件,安全工具
Java内存马研判分析
原创
hr
hr
网安前线
2026年9月17日 08:00
广东
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
一、概述
Java 内存马(Memory WebShell)是一类不会落地磁盘、驻留在 JVM 内存中的恶意 Web 后门。Tomcat、Jetty、Undertow 这类 Java Web 应用基于 Servlet 体系运行,服务启动后会在 JVM 中加载 Servlet、Filter、Listener 等组件。内存马借助 Java 反射、字节码动态加载、类注入技术,在程序运行期间动态创建恶意的 Servlet/Filter/Listener,并将其注册到容器上下文对象中;恶意类仅保存在 JVM 堆内存,不会写入服务器硬盘,访问对应路由时,容器就会触发恶意组件执行,接收攻击者传入的命令并在服务器执行。
内存马的核心不在于单纯把恶意代码放到内存里,而是让恶意代码接入 Web 应用正常的请求处理链路。这也是它隐蔽性较强的关键原因:恶意代码可以依附于正常 Web 容器运行,并非独立存在的文件,不易通过传统的文件查杀手段发现。
二、植入方式
内存马常见初始入口包括 Java 反序列化、表达式注入以及其他能够获取 Java 代码执行能力的漏洞,搭配对应的内存马 Payload 即可一键植入。
若目标已存在落地 WebShell 连接,哥斯拉、冰蝎、蚁剑等 WebShell 管理工具均内置内存马植入插件,支持一键部署。
三、原理与类型
理解 Java 内存马,需要先掌握 Java 类加载机制与 Web 容器的请求处理流程。Java 中的 Class 经由 ClassLoader 加载后,才能在 JVM 中运行。攻击者拿到 Java 代码执行权限后,借助反射、动态类加载等技术,把恶意 Class 载入当前 JVM。但仅完成恶意类加载,并不代表成功植入内存马:恶意 Class 存入 JVM 后,Web 容器并不知道何时调用这段代码,还需要把恶意逻辑挂载到 Web 容器或应用框架中,接入 HTTP 请求处理链路,当收到特定访问请求时,才能触发恶意代码执行。
内存马的实现分为三个核心步骤:一是代码加载,依靠 ClassLoader、反射机制将恶意代码载入 JVM;二是运行时注册,把恶意组件注册到 Servlet、Filter、Listener、Valve 或者 Spring MVC 等原生组件体系,使其接入 Web 请求处理流程;三是建立触发条件,通过 URL、请求参数、请求头、Cookie 等特征识别攻击者的请求,执行恶意逻辑。根据恶意代码挂载位置的差异,Java 内存马主要分类:
1.传统 Web 应用型:包含 Servlet 型、Filter 型、Listener 型;
2.框架型:包含 Spring Controller 型、Spring Interceptor 型、Spring WebFlux 型;
3.Tomcat 中间件型:包含 Valve 型(动态注册 Valve 阀门组件)、Upgrade/Executor/Poller 型(替换或新增 Tomcat 全局组件)、Grizzly 型;
4.Agent 型:通过 Hook 篡改 JVM 关键方法,植入恶意逻辑;
5.其他类型:WebSocket 型(注册 WebSocket 路由与处理逻辑)、Tomcat JSP 型(操纵 JSP 管理逻辑实现驻留)、线程型(创建常驻后台线程)、RMI 型(动态启动 RMI Registry)。
四、研判分析
排查内存马时,先识别网站所用框架,判断可能植入的内存马类型,再开展异常类的排查。排查手段包括:
1、与开发人员核对组件清单,识别新增未知组件;
2、查找源码中未定义的访问路由;
3、导出当前类列表进行分析,区分业务固有类与新增可疑类;
4、根据当前框架选择对应工具辅助分析;
5、关注访问路径不存在、但访问日志返回200状态码的请求。
演示环境 Tomcat,排查工具:Arthas
Arthas 是 Java 应用监控诊断工具,能够全局实时查看应用类加载、内存、GC、线程状态。可以用于内存马排查分析。
项目地址:https://github.com/alibaba/arthas
1、查看 tomcat 注册的 MBean 路由。路由为空或者路由地址对应不到具体文件,大概率是内存马。只能查看Servlet类型。
mbean | grep "name=/"
2、sc查看JVM 已加载的类信息,根据内存马常见的固定后缀、类名特征以及代码关键字筛选可疑类,再进一步判定是否为恶意类。可以用 AI 辅助分析。
sc *.Servletsc *.Valvesc * | grep Controllersc * | grep Memshell
3、sc -d 输出类详细信息,包含类加载器、类来源、是否是动态生成类等。
sc -d *.Filtersc -d 具体类名
关注 code-source 是否为空,内存马是运行时通过字节码直接 defineClass 注入,没有磁盘上对应的 class 文件。正常从磁盘 jar/class 文件加载的类,code-source 会显示 jar 包路径或者 class 文件路径。部分框架动态代理类也会 code-source=null,需要结合源码。
关注classLoader(类加载器),看这个加载器是否属于当前 Web 应用。classloader -t 查看类加载器树。
classloader -c查看该类加载器加载的资源,内存马类不存在本地资源。
4、使用jad命令反编译源码。
jad --source-only org.apache.coyote.ser.std.EnumSerializer > 1.java
内存马清理:
不同框架,不同类型的内存马有不同的清理方式,处置流程遵循先取证、后清理原则:采集字节码、反编译代码、留存 MBean、路由与访问日志;再根据内存马类型在线卸载恶意组件。清理完成后复核验证后门是否失效。若在线清理无效、存在自重建或多恶意类情况,则在业务低峰重启 Java 进程作为兜底手段。最后修复漏洞,防止二次注入。
其他项目:
1、java-memshell-scanner扫描tomcat下Filter、Servlet、Listener类型内存马,支持在线查杀。
https://github.com/c0ny1/java-memshell-scanner
2、shell-analyzer支持Filter、Servlet、Listener、Valve类型内存马的在线查杀。
https://github.com/4ra1n/shell-analyzer
3、memory-shell-detector支持多种框架多种类型内存马在线查杀。
https://github.com/private-xss/memory-shell-detector
4、JavaShellRadar扫描 JVM 内全部已加载类,生成可疑类检测报告。
https://github.com/RynezzZ/JavaShellRadar
5、RASP 防护:RASP 可实时监测内存马的异常行为,触发告警,并支持在线查杀。
五、总结
Java 内存马依托动态类加载与反射注册技术,将恶意逻辑无缝嵌入 Web 请求处理链路,具有无文件落地、依附容器进程运行、隐蔽性强、难以通过传统文件查杀手段发现的特点,植入入口集中于反序列化、表达式注入等代码执行类漏洞。研判时应遵循先识别框架、再定位类型的思路,通过组件核对、路由比对、类列表导出与访问日志分析锁定可疑点,再借助 Arthas 等工具从 MBean 路由、类加载来源、类加载器归属等维度交叉验证,避免单一特征误判;清理时坚持先取证、后清理原则,在线卸载为主、重启进程兜底,并同步修复漏洞防止二次注入;日常防护上应将安全设备告警监测与定期专项排查相结合,从边界防护与纵深检测层面压缩内存马生存空间,同时加强开发安全管控,从源头降低内存马植入风险。
参考资料:https://github.com/Getshell/Mshell
END
点击下方名片进入公众号
公众号专注于传递网安价值、普及知识、分享实战经验,分感悟、实践两类等,敬请关注。
AIGC标识: 31528647-e1f3-46cf-b862-9664bb0622c1
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:网安前线 hr
hr《Java内存马研判分析》