应急响应——全类型JAVA内存马排查
字数 1814 2025-08-20 18:18:10

Java内存马排查与防御指南

一、内存马概述

1.1 内存马定义

内存马是一种驻留在内存中的恶意程序,特点是不落地存储,仅存在于内存中。在Java Web环境中,内存马通过篡改或利用Web应用的处理逻辑来实现持久化控制。

1.2 内存马实现原理

内存马主要通过两种方式接管Web应用处理逻辑:

  1. 直接篡改JVM中Web应用处理逻辑类的实现
  2. 利用Web应用自身的可扩展性动态添加组件

1.3 内存马分类

根据实现方式不同,Java内存马可分为三类:

  1. 基于动态注册Servlet组件:Servlet、Filter、Listener
  2. 基于动态注册框架组件:如Spring MVC的Controller
  3. 基于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工具

  1. 查找实现Servlet接口的类:
sc -d javax.servlet.Servlet*
  1. 查找实现Filter接口的类:
sc -d javax.servlet.Filter*
  1. 查找实现ServletRequestListener接口的类:
sc -d javax.servlet.ServletRequestListener*

关键命令

  • sc -d * --interfaces javax.servlet.Servlet 查找接口实现类
  • jad 类名 反编译可疑类查看实现逻辑

方法3:内存Dump分析

  1. 使用jmap导出堆内存:
jmap -dump:format=b,file=heap.bin <pid>
  1. 使用MAT或JDK工具分析:
  • 搜索字节码特征"cafebabe"
  • 搜索敏感关键词:shell、memshell、eval等

方法4:文件系统检查

检查Tomcat的/ROOT/org/apache/jsp/目录下是否存在可疑的$匿名类文件

三、框架组件内存马排查

3.1 Spring环境内存马特征

  • 动态注册Controller到RequestMappingHandlerMapping
  • 利用Spring的上下文获取机制

3.2 排查方法

方法1:Arthas排查

  1. 查找自定义ClassLoader:
classloader -l
  1. 查找被特定ClassLoader加载的类:
sc -d * --classloader <hashcode>
  1. 检查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分析

  1. 搜索yv66vg特征定位注入的类
  2. 检查Instrumentation相关调用栈
  3. 查找内存中的解密类实现

五、防御与清除建议

5.1 防御措施

  1. 关闭不必要的JVM attach功能
  2. 限制动态类加载能力
  3. 监控关键类的字节码修改
  4. 加强Web应用组件注册的权限控制

5.2 清除方法

  1. 对于Servlet组件马:
  • 通过StandardContext移除恶意组件
  • 重启Web应用
  1. 对于框架组件马:
  • 清除RequestMappingHandlerMapping中的恶意注册
  • 清除自定义ClassLoader
  1. 对于Agent马:
  • 终止恶意Agent进程
  • 恢复被修改的类字节码

六、总结

内存马排查的核心思路:

  1. 组件型内存马:查找异常注册的组件实例
  2. 框架型内存马:分析动态注册的组件和ClassLoader
  3. Agent型内存马:检查关键类的方法实现

有效的排查工具组合:

  • Arthas:动态分析JVM状态
  • 内存分析工具:MAT、Eclipse Memory Analyzer
  • 自定义扫描脚本:针对特定场景定制检测逻辑

关键点:内存马一定会留下痕迹,通过合理的方法和工具组合,可以有效发现和清除各类内存马。

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脚本扫描 特征点 : 关注匿名内部类(类名包含$符号) 关注非标准路径的组件注册 特别关注Filter的url-pattern 方法2:使用Arthas工具 查找实现Servlet接口的类: 查找实现Filter接口的类: 查找实现ServletRequestListener接口的类: 关键命令 : sc -d * --interfaces javax.servlet.Servlet 查找接口实现类 jad 类名 反编译可疑类查看实现逻辑 方法3:内存Dump分析 使用jmap导出堆内存: 使用MAT或JDK工具分析: 搜索字节码特征"cafebabe" 搜索敏感关键词:shell、memshell、eval等 方法4:文件系统检查 检查Tomcat的 /ROOT/org/apache/jsp/ 目录下是否存在可疑的$匿名类文件 三、框架组件内存马排查 3.1 Spring环境内存马特征 动态注册Controller到RequestMappingHandlerMapping 利用Spring的上下文获取机制 3.2 排查方法 方法1:Arthas排查 查找自定义ClassLoader: 查找被特定ClassLoader加载的类: 检查RequestMappingHandlerMapping的注册信息 方法2:内存特征搜索 搜索字节码Base64特征"yv66vg" 搜索硬编码的恶意类内容 方法3:业务接口分析 结合流量分析确定可疑注入点 检查任意类加载、反射调用等高风险接口 四、JavaAgent内存马排查 4.1 常见注入点 修改javax.servlet.http.HttpServlet.service()方法 修改weblogic.servlet.internal.ServletStubImpl.execute()方法 4.2 排查方法 方法1:关键类检查 使用Arthas检查常见被修改的类: 关注方法实现中是否被插入恶意逻辑 方法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 自定义扫描脚本:针对特定场景定制检测逻辑 关键点 :内存马一定会留下痕迹,通过合理的方法和工具组合,可以有效发现和清除各类内存马。