开启AJP认证能防Ghostcat吗?
ApacheTomcat CVE-2020-1938 Ghostcat高危文件读取/包含漏洞复现
Ghostcat,这个编号CVE-2020-1938的漏洞,曾经让无数使用Apache Tomcat的系统管理员彻夜难眠。它的本质是AJP协议的一个设计缺陷,允许攻击者读取服务器上的任意文件,甚至实现远程代码执行。当安全团队紧急寻找缓解措施时,“为AJP Connector配置secret认证”这一建议频繁出现在各类修复指南中。这自然引出了一个核心疑问:开启AJP认证,真的就能把Ghostcat这只“幽灵猫”挡在门外吗?
认证机制:一道被误解的“门锁”
要回答这个问题,得先拆解AJP认证(即配置secretRequired和secret属性)到底做了什么。AJP(Apache JServ Protocol)本身是一个性能优化的二进制协议,主要用于Tomcat与前端Web服务器(如Apache HTTPD)之间的通信。配置认证凭证,相当于在这条专用的、受信任的内部通道上加了一把锁。只有知道“密钥”(secret)的客户端(通常是前置的Web服务器)才能与Tomcat的AJP端口(默认8009)建立连接并进行请求转发。
从协议层面看,这确实提升了安全性。它防止了任意未知客户端直接连接AJP端口,将访问权限收缩到了一个可控的范围内。如果攻击者无法与8009端口建立有效的AJP会话,自然也就无法发送构造好的恶意AJP请求包去触发Ghostcat漏洞。从这个角度说,开启认证是有效的边界防护措施。
但“有效”不等于“根治”
这里存在一个危险的认知偏差:把访问控制等同于漏洞修复。Ghostcat漏洞的根源,在于Tomcat处理AJP请求的代码逻辑存在缺陷。认证就像是在有缺陷的城堡大门外增设了一个哨卡,它拦住了外来的游兵散勇,却无法改变城堡城墙本身存在裂缝的事实。
考虑一个典型的架构:Nginx/Apache(前端) -> Tomcat(后端,通过AJP连接)。认证secret配置在Tomcat的server.xml和前端服务器的连接配置中。在这种情况下,攻击面发生了转移:
- 如果攻击者已渗透前端Web服务器,或者通过其他漏洞获取了secret,他就能以“合法”身份使用AJP协议,漏洞依然存在并可被利用。
- 如果secret配置过于简单或被暴力猜解,这道防线同样会失效。
- 最重要的是,认证机制完全没有触及漏洞的本体——有缺陷的请求处理代码。只要AJP连接得以建立,无论是否经过认证,恶意构造的请求包一旦发出,漏洞触发条件就满足了。
横向对比:为什么升级才是唯一正解
将开启认证与官方修复方案对比,差异一目了然。官方在受影响的版本(如9.0.31)中,直接修改了org.apache.coyote.ajp.AbstractAjpProcessor等相关类的代码,从逻辑层面修补了文件读取和请求验证的缺陷。这是对漏洞根源的彻底手术。
而开启认证,更像是在病人(有漏洞的Tomcat)周围拉了一条警戒线,告诫外人不要靠近,但病人体内的“病灶”并未消除。一旦警戒线因任何原因被突破(如内部人员失误、其他漏洞导致secret泄露),系统将立即暴露在风险之下。
因此,在安全实践中,开启AJP认证通常被归类为一种临时的风险缓解(Mitigation)或补偿性控制(Compensating Control)措施,而非根本的修复(Remediation)。它适用于那些因特殊原因无法立即升级、但又必须降低风险的场景。
结论:一道必要的屏障,而非坚固的城墙
所以,回到最初的问题:开启AJP认证能防Ghostcat吗?答案是“能防一部分,但不能根除”。
它通过增加身份验证,显著缩小了攻击面,能够有效抵御来自互联网的、无凭证的扫描和攻击尝试,在多数场景下可以将其风险从“危急”降至“高危”或“中危”。对于无法立即升级的系统,配置强密码的AJP认证是必须完成的操作。
但安全人员必须清醒认识到,这绝非一劳永逸的解决方案。真正的安全,永远来自于对漏洞本体的修补。只要那个旧版本的、存在缺陷的Tomcat二进制文件还在运行,风险就如影随形。Ghostcat这只幽灵,只是被暂时挡在了认证的门外,它并未真正消散。最终,升级到安全版本,或者彻底关闭不必要的AJP服务,才是让幽灵彻底安息的唯一方式。

参与讨论
确实能挡住外部扫描。
AJP secret可以随便写吗?🤔
我之前忘关8009,差点被攻击。
听说还有人直接把AJP关了。