应急响应——全类型JAVA内存马排查
字数 1814 2025-08-20 18:18:10
Java内存马排查与防御指南
一、内存马概述
1.1 内存马定义
内存马是一种驻留在内存中的恶意程序,特点是不落地存储,仅存在于内存中。在Java Web环境中,内存马通过篡改或利用Web应用的处理逻辑来实现持久化控制。
1.2 内存马实现原理
内存马主要通过两种方式接管Web应用处理逻辑:
- 直接篡改JVM中Web应用处理逻辑类的实现
- 利用Web应用自身的可扩展性动态添加组件
1.3 内存马分类
根据实现方式不同,Java内存马可分为三类:
- 基于动态注册Servlet组件:Servlet、Filter、Listener
- 基于动态注册框架组件:如Spring MVC的Controller
- 基于JavaAgent的字节码修改:通过Instrumentation API修改关键类
二、Servlet组件内存马排查
2.1 常见注入方式
- 创建新的Servlet并注册到ServletMap
- 创建新的Filter并注册到FilterChain
- 创建新的Listener并注册到Listener列表
2.2 排查方法
方法1:使用jsp脚本扫描
// 使用c0ny1的tomcat-memshell-scanner.jsp
// 获取StandardContext后检查servletMap、filterMap、listenerList
特征点:
- 关注匿名内部类(类名包含$符号)
- 关注非标准路径的组件注册
- 特别关注Filter的url-pattern
方法2:使用Arthas工具
- 查找实现Servlet接口的类:
sc -d javax.servlet.Servlet*
- 查找实现Filter接口的类:
sc -d javax.servlet.Filter*
- 查找实现ServletRequestListener接口的类:
sc -d javax.servlet.ServletRequestListener*
关键命令:
sc -d * --interfaces javax.servlet.Servlet查找接口实现类jad 类名反编译可疑类查看实现逻辑
方法3:内存Dump分析
- 使用jmap导出堆内存:
jmap -dump:format=b,file=heap.bin <pid>
- 使用MAT或JDK工具分析:
- 搜索字节码特征"cafebabe"
- 搜索敏感关键词:shell、memshell、eval等
方法4:文件系统检查
检查Tomcat的/ROOT/org/apache/jsp/目录下是否存在可疑的$匿名类文件
三、框架组件内存马排查
3.1 Spring环境内存马特征
- 动态注册Controller到RequestMappingHandlerMapping
- 利用Spring的上下文获取机制
3.2 排查方法
方法1:Arthas排查
- 查找自定义ClassLoader:
classloader -l
- 查找被特定ClassLoader加载的类:
sc -d * --classloader <hashcode>
- 检查RequestMappingHandlerMapping的注册信息
方法2:内存特征搜索
- 搜索字节码Base64特征"yv66vg"
- 搜索硬编码的恶意类内容
方法3:业务接口分析
- 结合流量分析确定可疑注入点
- 检查任意类加载、反射调用等高风险接口
四、JavaAgent内存马排查
4.1 常见注入点
- 修改javax.servlet.http.HttpServlet.service()方法
- 修改weblogic.servlet.internal.ServletStubImpl.execute()方法
4.2 排查方法
方法1:关键类检查
使用Arthas检查常见被修改的类:
jad javax.servlet.http.HttpServlet
jad weblogic.servlet.internal.ServletStubImpl
关注方法实现中是否被插入恶意逻辑
方法2:内存Dump分析
- 搜索yv66vg特征定位注入的类
- 检查Instrumentation相关调用栈
- 查找内存中的解密类实现
五、防御与清除建议
5.1 防御措施
- 关闭不必要的JVM attach功能
- 限制动态类加载能力
- 监控关键类的字节码修改
- 加强Web应用组件注册的权限控制
5.2 清除方法
- 对于Servlet组件马:
- 通过StandardContext移除恶意组件
- 重启Web应用
- 对于框架组件马:
- 清除RequestMappingHandlerMapping中的恶意注册
- 清除自定义ClassLoader
- 对于Agent马:
- 终止恶意Agent进程
- 恢复被修改的类字节码
六、总结
内存马排查的核心思路:
- 组件型内存马:查找异常注册的组件实例
- 框架型内存马:分析动态注册的组件和ClassLoader
- Agent型内存马:检查关键类的方法实现
有效的排查工具组合:
- Arthas:动态分析JVM状态
- 内存分析工具:MAT、Eclipse Memory Analyzer
- 自定义扫描脚本:针对特定场景定制检测逻辑
关键点:内存马一定会留下痕迹,通过合理的方法和工具组合,可以有效发现和清除各类内存马。