Tomcat漏洞修复升级——被遗忘的中间件安全安全通告来了等保测评报告下发。高危漏洞Tomcat 多个漏洞包括CVE-2024-XXXXTomcat 信息泄露CVE-2024-YYYYTomcat 请求走私总计45个漏洞需要修复修复方案从 Tomcat 8 升级到 Tomcat 9.0。听起来很简单但我们在政务系统上跑了6年的 Tomcat 8上面挂了 30 个应用直接升级没那么简单。第一次升级目标Tomcat 8.5 → Tomcat 9.0.x问题1过滤器不兼容严重: Exception starting filter [encodingFilter] java.lang.AbstractMethodError原因Tomcat 9 重构了 Filter 接口旧版过滤器不兼容。解决重写自定义过滤器不再继承旧版BaseFilter直接实现javax.servlet.Filter接口。// 旧代码Tomcat 8publicclassEncodingFilterextendsBaseFilter{publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain){req.setCharacterEncoding(UTF-8);chain.doFilter(req,res);}}// 新代码Tomcat 9publicclassEncodingFilterimplementsFilter{publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsIOException,ServletException{req.setCharacterEncoding(UTF-8);chain.doFilter(req,res);}}问题2server.xml 配置变更Tomcat 9 废弃了部分配置项!-- Tomcat 8 旧配置 --Connectorport8080protocolHTTP/1.1URIEncodingUTF-8compressiononcompressableMimeTypetext/html,text/xml,text/plain/!-- Tomcat 9 新配置 --Connectorport8080protocolorg.apache.coyote.http11.Http11NioProtocolURIEncodingUTF-8compressiononcompressibleMimeTypetext/html,text/xml,text/plain/注意compressableMimeType改成了compressibleMimeType拼写修正。问题3TLS 协议变更Tomcat 9 默认禁用 TLS 1.0/1.1只启用 TLS 1.2/1.3。但我们的旧客户端只支持 TLS 1.0。!-- 兼容旧客户端 --Connectorport8443protocolorg.apache.coyote.http11.Http11NioProtocolSSLEnabledtruesslProtocolsTLSv1.2,TLSv1.1,TLSv1ciphersTLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,...教训安全升级不能一刀切需要考虑生态兼容性。第二次升级背景漏洞扫描又来了这次报了45个漏洞。目标Tomcat 8.5 → Tomcat 9.0.x再次尝试新问题编码问题tomcat9 编码问题现象页面中文乱码。排查检查 URI 编码URIEncodingUTF-8已配置检查请求体编码request.setCharacterEncoding(UTF-8)已调用检查 Tomcat 9 默认编码Tomcat 9 默认使用UTF-8但旧应用使用ISO-8859-1根因Tomcat 8 默认 URI 编码是ISO-8859-1Tomcat 9 改成了UTF-8。// Tomcat 8 行为request.getParameter(name)// 如果传的是中文可能乱码// Tomcat 9 行为request.getParameter(name)// 默认 UTF-8 解码解决显式配置URIEncodingUTF-8并排查所有应用层编码处理。降级回滚记录tomcat9有内容不兼容降级到tomcat7.99原因某个第三方组件只在 Tomcat 8 上验证过Tomcat 9 上出现类加载器问题。java.lang.NoClassDefFoundError: javax/ws/rs/ext/MessageBodyReader根因Tomcat 9 使用新的模块化类加载器旧组件的 META-INF/services 机制失效。决策降级到 Tomcat 8.5即日志中的 “7.99”实际是 8.5。经验中间件升级要考虑全链路兼容性特别是第三方闭源组件。第三次修复最新记录tomcat安全漏洞整改这次换了个策略——不升级大版本只打补丁。补丁方案——详细操作步骤第一步确认当前版本${CATALINA_HOME}/bin/version.sh# 确认当前为 Tomcat 8.5.xx第二步下载当前大版本的最新patch去 Tomcat 官网下载当前 8.5.x 的最新版本wgethttps://archive.apache.org/dist/tomcat/tomcat-8/v8.5.100/bin/apache-tomcat-8.5.100.tar.gz第三步只替换二进制文件不动应用# 停止Tomcat${CATALINA_HOME}/bin/shutdown.sh# 备份全量备份保底cp-r${CATALINA_HOME}${CATALINA_HOME}_bak_$(date%Y%m%d)# 只替换bin、lib目录不动webapps、conf、logscp-rapache-tomcat-8.5.100/bin/*${CATALINA_HOME}/bin/cp-rapache-tomcat-8.5.100/lib/*${CATALINA_HOME}/lib/# 启动${CATALINA_HOME}/bin/startup.shwebapps目录不动里面是应用conf里的server.xml、web.xml等尽量保留原有配置。第四步安全加固配置版本升级只是第一步配置加固同样重要4.1 关闭 AJP 连接器AJP 是漏洞重灾区如 CVE-2020-1938 “Ghostcat”!-- conf/server.xml —— 注释掉AJP --!-- Connector port8009 protocolAJP/1.3 redirectPort8443 / --!-- 隐藏版本号 --Connectorport8080protocolHTTP/1.1connectionTimeout20000URIEncodingUTF-8serverApache/4.2 删除默认应用防止暴露版本信息和后台入口rm-rf${CATALINA_HOME}/webapps/docsrm-rf${CATALINA_HOME}/webapps/examplesrm-rf${CATALINA_HOME}/webapps/managerrm-rf${CATALINA_HOME}/webapps/host-manager4.3 安全响应头conf/web.xml 或应用 Filterfilterfilter-nameHttpHeaderSecurityFilter/filter-namefilter-classorg.apache.catalina.filters.HttpHeaderSecurityFilter/filter-classasync-supportedtrue/async-supportedinit-paramparam-namexssProtectionEnabled/param-nameparam-valuetrue/param-value/init-paraminit-paramparam-nameantiClickJackingEnabled/param-nameparam-valuetrue/param-value/init-paraminit-paramparam-nameblockContentTypeSniffingEnabled/param-nameparam-valuetrue/param-value/init-param/filter4.4 禁用目录列表conf/web.xmllistings设为false4.5 限制 HTTP 方法只允许 GET/POST禁止 PUT、DELETE、TRACE、OPTIONSsecurity-constraintweb-resource-collectionweb-resource-nameRestricted Methods/web-resource-nameurl-pattern/*/url-patternhttp-methodPUT/http-methodhttp-methodDELETE/http-methodhttp-methodTRACE/http-methodhttp-methodOPTIONS/http-method/web-resource-collectionauth-constraint//security-constraint第五步验证# AJP是否关闭netstat-tlnp|grep8009# 应该无输出# 版本号是否隐藏curl-Ihttp://localhost:8080/# 目录列表是否禁用curlhttp://localhost:8080/some-nonexistent-path/# 应返回403/404# 漏洞扫描# 用安全扫描工具Nessus/OpenVAS重新扫描确认漏洞已修复性能综合评估patch版本升级后启动时间、内存占用、响应时间、并发能力均无明显变化——patch版本本质上只改了 bug 修复不影响性能。升级版本 vs 安全加固效果对比措施解决的问题效果升级到最新patch修复已知CVE覆盖大量历史漏洞关闭AJPAJP协议漏洞消除最危险的攻击面隐藏版本号信息泄露增加攻击难度删除默认应用信息泄露、管理入口暴露减少攻击面安全响应头XSS、点击劫持防御常见Web攻击禁用目录列表敏感文件暴露防止源码/配置泄露限制HTTP方法不安全方法减少攻击向量为什么最终选择打补丁而不是升级方式升级大版本打补丁风险高API不兼容低接口不变时间2-3天含回归测试2-3小时效果彻底修复临时修复长期维护好差后续还有漏洞现实选择业务不能停只能选低风险方案。线程限制问题除了漏洞Tomcat 还有性能相关的问题Tomcat 最大线程限制人脸识别离线版本测试及压力测试、接口定义、tomcat最大线程限制场景人脸认证服务部署在 Tomcat 上并发认证时响应变慢。排查Tomcat 默认最大线程数 200活体检测算法处理慢300ms/次当并发超过 200 时请求排队。优化Connectorport8080protocolHTTP/1.1maxThreads500acceptCount100maxConnections1000connectionTimeout30000/教训中间件默认配置是按通用场景设计的特定业务需要针对性调优。升级操作手册1. 准备工作# 1. 备份当前配置cp-r$CATALINA_HOME/conf$BACKUP_DIR/tomcat-conf-$(date%Y%m%d)cp-r$CATALINA_HOME/webapps$BACKUP_DIR/tomcat-webapps-$(date%Y%m%d)cp-r$CATALINA_HOME/lib$BACKUP_DIR/tomcat-lib-$(date%Y%m%d)# 2. 记录当前版本$CATALINA_HOME/bin/version.sh# 3. 导出所有配置项$CATALINA_HOME/bin/catalina.sh configtest212. 配置文件迁移清单# Tomcat 升级配置迁移清单files_to_migrate:-conf/server.xml-conf/web.xml-conf/context.xml-conf/catalina.properties-conf/logging.properties-bin/setenv.sh (自定义JVM参数)check_items:-自定义阀门(Valve)兼容性-JNDI数据源配置-Realm配置-连接器(Connector)配置-类库冲突检查3. 应用兼容性检查清单app_compatibility:servlet_api:3.1 → 4.0jsp_api:2.3 → 2.4el_api:3.0 → 4.0websocket_api:1.1 → 2.0breaking_changes:-javax.servlet → jakarta.servlet (Tomcat 10)-默认URI编码变更-类加载器行为变更-JSP编译方式变更4. 回滚方案rollback_plan:condition:任一应用出现兼容性问题steps:1. 停止Tomcat服务 2. 恢复备份的conf目录 3. 恢复备份的webapps目录 4. 恢复备份的lib目录 5. 启动旧版本Tomcat 6. 验证所有应用正常rollback_time: 30分钟漏洞修复清单漏洞数修复方式耗时结果10升级到9.03天部分应用兼容性问题45升级到9.02天编码问题需修复-降级到8.51天第三方组件不兼容若干打补丁3小时完成修复经验教训1. 中间件升级要慢不要跳版本8 → 9中间最好验证 8.5 最新补丁版不要全量先升级一个非核心应用试水不要限期留够回归测试时间2. 兼容性测试要全需要测试的方面所有应用30个应用逐个验证所有功能登录、查询、导出、打印所有第三方报表引擎、工作流引擎、消息中间件所有客户端浏览器版本、操作系统、手机型号3. 漏洞修复要快等保要求高危漏洞7天内修复中危漏洞30天内修复低危漏洞90天内修复4. 架构优化要远长期来看更好的方案是long_term_plan:# 方案1使用嵌入式TomcatSpring Boot-应用自带Tomcat独立升级-每个应用互不影响# 方案2使用Nginx反向代理 多版本Tomcat-Nginx统一入口-不同应用使用不同Tomcat版本# 方案3迁移到云原生-容器化部署-中间件独立升级-蓝绿发布最后的话Tomcat 就像家里的水管——平时没人关注但一旦漏水整个房子都要遭殃。Tomcat 升级的三大悖论安全悖论越早升级越安全但越早升级兼容性越差维护悖论越老的版本漏洞越多但越老的版本越稳定管理悖论漏洞修复要求快但政务系统变更要求慢最终建议生产环境大版本不动只打安全补丁测试环境逐步验证新版本新项目直接用 Spring Boot 嵌入式 Tomcat旧项目等系统重构时一并升级
Tomcat漏洞修复升级——被遗忘的中间件安全
发布时间:2026/5/16 7:21:06
Tomcat漏洞修复升级——被遗忘的中间件安全安全通告来了等保测评报告下发。高危漏洞Tomcat 多个漏洞包括CVE-2024-XXXXTomcat 信息泄露CVE-2024-YYYYTomcat 请求走私总计45个漏洞需要修复修复方案从 Tomcat 8 升级到 Tomcat 9.0。听起来很简单但我们在政务系统上跑了6年的 Tomcat 8上面挂了 30 个应用直接升级没那么简单。第一次升级目标Tomcat 8.5 → Tomcat 9.0.x问题1过滤器不兼容严重: Exception starting filter [encodingFilter] java.lang.AbstractMethodError原因Tomcat 9 重构了 Filter 接口旧版过滤器不兼容。解决重写自定义过滤器不再继承旧版BaseFilter直接实现javax.servlet.Filter接口。// 旧代码Tomcat 8publicclassEncodingFilterextendsBaseFilter{publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain){req.setCharacterEncoding(UTF-8);chain.doFilter(req,res);}}// 新代码Tomcat 9publicclassEncodingFilterimplementsFilter{publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsIOException,ServletException{req.setCharacterEncoding(UTF-8);chain.doFilter(req,res);}}问题2server.xml 配置变更Tomcat 9 废弃了部分配置项!-- Tomcat 8 旧配置 --Connectorport8080protocolHTTP/1.1URIEncodingUTF-8compressiononcompressableMimeTypetext/html,text/xml,text/plain/!-- Tomcat 9 新配置 --Connectorport8080protocolorg.apache.coyote.http11.Http11NioProtocolURIEncodingUTF-8compressiononcompressibleMimeTypetext/html,text/xml,text/plain/注意compressableMimeType改成了compressibleMimeType拼写修正。问题3TLS 协议变更Tomcat 9 默认禁用 TLS 1.0/1.1只启用 TLS 1.2/1.3。但我们的旧客户端只支持 TLS 1.0。!-- 兼容旧客户端 --Connectorport8443protocolorg.apache.coyote.http11.Http11NioProtocolSSLEnabledtruesslProtocolsTLSv1.2,TLSv1.1,TLSv1ciphersTLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,...教训安全升级不能一刀切需要考虑生态兼容性。第二次升级背景漏洞扫描又来了这次报了45个漏洞。目标Tomcat 8.5 → Tomcat 9.0.x再次尝试新问题编码问题tomcat9 编码问题现象页面中文乱码。排查检查 URI 编码URIEncodingUTF-8已配置检查请求体编码request.setCharacterEncoding(UTF-8)已调用检查 Tomcat 9 默认编码Tomcat 9 默认使用UTF-8但旧应用使用ISO-8859-1根因Tomcat 8 默认 URI 编码是ISO-8859-1Tomcat 9 改成了UTF-8。// Tomcat 8 行为request.getParameter(name)// 如果传的是中文可能乱码// Tomcat 9 行为request.getParameter(name)// 默认 UTF-8 解码解决显式配置URIEncodingUTF-8并排查所有应用层编码处理。降级回滚记录tomcat9有内容不兼容降级到tomcat7.99原因某个第三方组件只在 Tomcat 8 上验证过Tomcat 9 上出现类加载器问题。java.lang.NoClassDefFoundError: javax/ws/rs/ext/MessageBodyReader根因Tomcat 9 使用新的模块化类加载器旧组件的 META-INF/services 机制失效。决策降级到 Tomcat 8.5即日志中的 “7.99”实际是 8.5。经验中间件升级要考虑全链路兼容性特别是第三方闭源组件。第三次修复最新记录tomcat安全漏洞整改这次换了个策略——不升级大版本只打补丁。补丁方案——详细操作步骤第一步确认当前版本${CATALINA_HOME}/bin/version.sh# 确认当前为 Tomcat 8.5.xx第二步下载当前大版本的最新patch去 Tomcat 官网下载当前 8.5.x 的最新版本wgethttps://archive.apache.org/dist/tomcat/tomcat-8/v8.5.100/bin/apache-tomcat-8.5.100.tar.gz第三步只替换二进制文件不动应用# 停止Tomcat${CATALINA_HOME}/bin/shutdown.sh# 备份全量备份保底cp-r${CATALINA_HOME}${CATALINA_HOME}_bak_$(date%Y%m%d)# 只替换bin、lib目录不动webapps、conf、logscp-rapache-tomcat-8.5.100/bin/*${CATALINA_HOME}/bin/cp-rapache-tomcat-8.5.100/lib/*${CATALINA_HOME}/lib/# 启动${CATALINA_HOME}/bin/startup.shwebapps目录不动里面是应用conf里的server.xml、web.xml等尽量保留原有配置。第四步安全加固配置版本升级只是第一步配置加固同样重要4.1 关闭 AJP 连接器AJP 是漏洞重灾区如 CVE-2020-1938 “Ghostcat”!-- conf/server.xml —— 注释掉AJP --!-- Connector port8009 protocolAJP/1.3 redirectPort8443 / --!-- 隐藏版本号 --Connectorport8080protocolHTTP/1.1connectionTimeout20000URIEncodingUTF-8serverApache/4.2 删除默认应用防止暴露版本信息和后台入口rm-rf${CATALINA_HOME}/webapps/docsrm-rf${CATALINA_HOME}/webapps/examplesrm-rf${CATALINA_HOME}/webapps/managerrm-rf${CATALINA_HOME}/webapps/host-manager4.3 安全响应头conf/web.xml 或应用 Filterfilterfilter-nameHttpHeaderSecurityFilter/filter-namefilter-classorg.apache.catalina.filters.HttpHeaderSecurityFilter/filter-classasync-supportedtrue/async-supportedinit-paramparam-namexssProtectionEnabled/param-nameparam-valuetrue/param-value/init-paraminit-paramparam-nameantiClickJackingEnabled/param-nameparam-valuetrue/param-value/init-paraminit-paramparam-nameblockContentTypeSniffingEnabled/param-nameparam-valuetrue/param-value/init-param/filter4.4 禁用目录列表conf/web.xmllistings设为false4.5 限制 HTTP 方法只允许 GET/POST禁止 PUT、DELETE、TRACE、OPTIONSsecurity-constraintweb-resource-collectionweb-resource-nameRestricted Methods/web-resource-nameurl-pattern/*/url-patternhttp-methodPUT/http-methodhttp-methodDELETE/http-methodhttp-methodTRACE/http-methodhttp-methodOPTIONS/http-method/web-resource-collectionauth-constraint//security-constraint第五步验证# AJP是否关闭netstat-tlnp|grep8009# 应该无输出# 版本号是否隐藏curl-Ihttp://localhost:8080/# 目录列表是否禁用curlhttp://localhost:8080/some-nonexistent-path/# 应返回403/404# 漏洞扫描# 用安全扫描工具Nessus/OpenVAS重新扫描确认漏洞已修复性能综合评估patch版本升级后启动时间、内存占用、响应时间、并发能力均无明显变化——patch版本本质上只改了 bug 修复不影响性能。升级版本 vs 安全加固效果对比措施解决的问题效果升级到最新patch修复已知CVE覆盖大量历史漏洞关闭AJPAJP协议漏洞消除最危险的攻击面隐藏版本号信息泄露增加攻击难度删除默认应用信息泄露、管理入口暴露减少攻击面安全响应头XSS、点击劫持防御常见Web攻击禁用目录列表敏感文件暴露防止源码/配置泄露限制HTTP方法不安全方法减少攻击向量为什么最终选择打补丁而不是升级方式升级大版本打补丁风险高API不兼容低接口不变时间2-3天含回归测试2-3小时效果彻底修复临时修复长期维护好差后续还有漏洞现实选择业务不能停只能选低风险方案。线程限制问题除了漏洞Tomcat 还有性能相关的问题Tomcat 最大线程限制人脸识别离线版本测试及压力测试、接口定义、tomcat最大线程限制场景人脸认证服务部署在 Tomcat 上并发认证时响应变慢。排查Tomcat 默认最大线程数 200活体检测算法处理慢300ms/次当并发超过 200 时请求排队。优化Connectorport8080protocolHTTP/1.1maxThreads500acceptCount100maxConnections1000connectionTimeout30000/教训中间件默认配置是按通用场景设计的特定业务需要针对性调优。升级操作手册1. 准备工作# 1. 备份当前配置cp-r$CATALINA_HOME/conf$BACKUP_DIR/tomcat-conf-$(date%Y%m%d)cp-r$CATALINA_HOME/webapps$BACKUP_DIR/tomcat-webapps-$(date%Y%m%d)cp-r$CATALINA_HOME/lib$BACKUP_DIR/tomcat-lib-$(date%Y%m%d)# 2. 记录当前版本$CATALINA_HOME/bin/version.sh# 3. 导出所有配置项$CATALINA_HOME/bin/catalina.sh configtest212. 配置文件迁移清单# Tomcat 升级配置迁移清单files_to_migrate:-conf/server.xml-conf/web.xml-conf/context.xml-conf/catalina.properties-conf/logging.properties-bin/setenv.sh (自定义JVM参数)check_items:-自定义阀门(Valve)兼容性-JNDI数据源配置-Realm配置-连接器(Connector)配置-类库冲突检查3. 应用兼容性检查清单app_compatibility:servlet_api:3.1 → 4.0jsp_api:2.3 → 2.4el_api:3.0 → 4.0websocket_api:1.1 → 2.0breaking_changes:-javax.servlet → jakarta.servlet (Tomcat 10)-默认URI编码变更-类加载器行为变更-JSP编译方式变更4. 回滚方案rollback_plan:condition:任一应用出现兼容性问题steps:1. 停止Tomcat服务 2. 恢复备份的conf目录 3. 恢复备份的webapps目录 4. 恢复备份的lib目录 5. 启动旧版本Tomcat 6. 验证所有应用正常rollback_time: 30分钟漏洞修复清单漏洞数修复方式耗时结果10升级到9.03天部分应用兼容性问题45升级到9.02天编码问题需修复-降级到8.51天第三方组件不兼容若干打补丁3小时完成修复经验教训1. 中间件升级要慢不要跳版本8 → 9中间最好验证 8.5 最新补丁版不要全量先升级一个非核心应用试水不要限期留够回归测试时间2. 兼容性测试要全需要测试的方面所有应用30个应用逐个验证所有功能登录、查询、导出、打印所有第三方报表引擎、工作流引擎、消息中间件所有客户端浏览器版本、操作系统、手机型号3. 漏洞修复要快等保要求高危漏洞7天内修复中危漏洞30天内修复低危漏洞90天内修复4. 架构优化要远长期来看更好的方案是long_term_plan:# 方案1使用嵌入式TomcatSpring Boot-应用自带Tomcat独立升级-每个应用互不影响# 方案2使用Nginx反向代理 多版本Tomcat-Nginx统一入口-不同应用使用不同Tomcat版本# 方案3迁移到云原生-容器化部署-中间件独立升级-蓝绿发布最后的话Tomcat 就像家里的水管——平时没人关注但一旦漏水整个房子都要遭殃。Tomcat 升级的三大悖论安全悖论越早升级越安全但越早升级兼容性越差维护悖论越老的版本漏洞越多但越老的版本越稳定管理悖论漏洞修复要求快但政务系统变更要求慢最终建议生产环境大版本不动只打安全补丁测试环境逐步验证新版本新项目直接用 Spring Boot 嵌入式 Tomcat旧项目等系统重构时一并升级