ARTICLE / 开源项目
memshell-auditor
项目亮点
直击内存马的本质
不靠类名关键词、不靠文件扫描,而是审计"容器里注册的组件,磁盘上到底存不存在这个 class"。无论攻击者把类名伪装成 org.springframework.* 还是随机字符串,磁盘上不存在就是不存在——A1 强信号一锤定音。
真实载荷 7/7 检出
用开源主流生成器 java-memshell-generator (JMG) v1.0.9 生成冰蝎、哥斯拉、蚁剑、Suo5 共 7 种内存马载荷(Filter/Listener/Valve 三种形态),注入 Tomcat 9/10 靶场实测,全部以 HIGH 级命中。
容器内部透视
通过 WebappClassLoader.resources 字段反射定位 StandardContext,遍历 filterDefs(内存马注入第一落点)、filterConfigs、Servlet、Listener、Valve 全链路组件注册表——不依赖线程上下文、不依赖 JMX。
零依赖纯反射
不引入任何第三方库,不依赖具体中间件类(编译期不引用 Tomcat/Spring),JDK 8 编译,目标 JVM 兼容 JDK 8-21+。attach 无侵入,不重启应用。
判断标准体系化
与应急响应方法论对齐:A 系强信号(磁盘无 class / Agent 注入)直接判高危,B 系辅助信号(类名特征 / 可疑关键字)提示人工复核,降低误报与漏报的平衡成本。
证据友好输出
JSON 报告包含级别、信号编号、类名、ClassLoader、判定原因与处置建议,可直接接入应急响应流程与工单系统;控制台同时输出人类可读摘要。
快速开始
示例输出:
实测检测结果(JMG 真实载荷)
| 载荷 | 工具 | 内存马类型 | 真实类名(伪装) | 容器 | 结果 |
|---|---|---|---|---|---|
| behinder-filter | 冰蝎 Behinder | JakartaFilter | org.springframework.ServletRequestAujFilter | Tomcat 10.1 | ✅ HIGH |
| godzilla-filter | 哥斯拉 Godzilla | JakartaFilter | org.springframework.WhiteBlackListGbyfbdFilter | Tomcat 10.1 | ✅ HIGH |
| antsword-filter | 蚁剑 AntSword | JakartaFilter | org.springframework.AbstractMatcherVyjFilter | Tomcat 10.1 | ✅ HIGH |
| suo5-filter | Suo5 隧道 | Filter | org.springframework.SessionKqvcFilter | Tomcat 9.0 | ✅ HIGH |
| behinder-listener | 冰蝎 Behinder | JakartaListener | org.apache.logging.Log4jConfigEaeListener | Tomcat 10.1 | ✅ HIGH |
| godzilla-valve | 哥斯拉 Godzilla | Valve | org.apache.AbstractMatcherGbValve | Tomcat 10.1 | ✅ HIGH |
| behinder-listener2 | 冰蝎 Behinder | Listener | org.springframework.ContextLoaderDmasjListener | Tomcat 9.0 | ✅ HIGH |
7/7 检出(100%)。完整测试记录见仓库 evidence/00-test-log.md。
项目结构
License
MIT