对于大多数不依赖 Apache httpd 等前端服务器反向代理的 Tomcat 9.0 实例,直接在 conf/server.xml 中注释掉 AJP Connector 配置是防止幽灵猫漏洞最彻底的方案。
先说结论:除非明确使用了 mod_jk 或 mod_proxy_ajp 对接前端 Web 服务器,否则建议直接禁用 AJP 协议以消除风险。
- 先判断:确认业务架构中是否有 Apache httpd 等通过 AJP 协议反向代理到 Tomcat。
- 优先做:修改 conf/server.xml 文件,注释或删除 AJP Connector 配置行。
- 再验证:重启服务后检查 8009 端口是否停止监听,并确认业务正常。
快速处理思路
修改配置文件比升级版本更直接,但操作前务必备份。如果无法立即重启,升级补丁版本也是官方推荐方案,但禁用协议能从根本上关闭攻击面。
操作路径通常为 Tomcat 安装目录下的 conf/server.xml。
为什么会这样
AJP(Apache JServ Protocol)原本设计用于 Tomcat 与前端 Web 服务器(如 Apache httpd)之间的高效通信。幽灵猫漏洞(CVE-2020-1938)的核心在于,旧版本 Tomcat 的 AJP 连接器默认配置可能存在鉴权缺失,且监听在所有网络接口上。
攻击者可以通过构造特定的 AJP 请求,欺骗 Tomcat 读取任意文件(包括 WEB-INF 下的 class 文件或配置文件),甚至在某些条件下包含上传的文件导致代码执行。禁用该协议意味着关闭了这个通信通道,攻击者无法再通过此路径发起请求。
分步处理
- 备份配置文件
在修改前,务必复制一份原始文件,以便出错时回滚。
cp conf/server.xml conf/server.xml.bak - 定位 AJP 配置
打开 conf/server.xml,查找包含 protocol="AJP/1.3" 的行。默认配置通常如下:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> - 禁用连接器
在该行前后添加 XML 注释符号,使其失效。
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->或者直接将 requiredSecret 设置为复杂字符串并限制 address 为 127.0.0.1,但直接禁用更稳妥。
- 重启 Tomcat
配置修改后需要重启服务才能生效。
bin/shutdown.sh bin/startup.sh
怎么验证是否生效
主要通过检查端口监听状态和日志来确认。
- 检查端口
使用 netstat 或 ss 命令查看 8009 端口是否还在监听。
ss -tlnp | grep 8009如果没有输出,说明 AJP 端口已关闭。
- 查看日志
观察 logs/catalina.out 或 logs/localhost.log,确认启动过程中没有加载 AJP 相关的报错,且服务正常启动。
- 漏洞扫描
使用安全的漏洞扫描工具对目标端口进行检测,确认无法通过 AJP 协议建立连接。
常见坑
- 误删导致业务中断
如果架构中确实使用了 Apache httpd + mod_jk 方案,禁用 AJP 会导致前端无法转发动态请求。修改前必须确认架构依赖。
- 修改后未重启
Tomcat 配置文件修改后不会热加载,必须重启进程。
- 默认 Secret 为空
如果必须保留 AJP 协议,务必在 Connector 配置中设置 requiredSecret 属性,并将 address 绑定为 127.0.0.1,避免暴露在公网。
- 版本混淆
Tomcat 8.5 和 7.0 也存在该漏洞,修复逻辑类似,但版本号不同,请根据实际安装版本操作。
参考来源
- Apache Tomcat Official Security Advisories - Tomcat 9.0.x, https://tomcat.apache.org/security-9.html
- NIST National Vulnerability Database - CVE-2020-1938, https://nvd.nist.gov/vuln/detail/CVE-2020-1938