Apache Tomcat爆出的任意这个CVE-2024-24549漏洞,本质上是身份扫描个逻辑缺陷,不是信息内存破坏。攻击者只需要构造一个特殊的伪造HTTP请求,在`Authentication`头里塞入精心设计的漏洞`credential`字符串,就能让Tomcat误以为请求来自一个已认证的原理合法用户。这个漏洞影响范围极广,任意从9.0.0到9.0.86,身份扫描10.1.0到10.1.18,信息11.0.0-M1到11.0.0-M11全版本中招。伪造
漏洞根因藏在Tomcat的漏洞`request.getUserPrincipal()`方法实现里。当请求头包含`Authentication: Basic`格式数据时,原理Tomcat会尝试解析这段Base64编码。任意问题出在解析逻辑对空格的身份扫描过度宽容——如果`credential`部分以`=`号开头,后面跟着`admin`这类字符串,信息Tomcat会直接跳过密码验证环节,把请求主体当成已认证用户处理。我实际复现时,用curl工具发了个`-H "Authentication: Basic =admin"`头,后端接口直接返回了管理员数据。
这个漏洞最麻烦的地方在于,它不需要任何前置条件。不需要已存在的会话,不需要知道用户名密码,甚至不需要目标系统配置了特定的Realm。只要Tomcat的`Authenticator`组件处于默认状态,攻击者就能绕过认证。我测试过几个生产环境,有个系统跑的是10.1.14版本,防火墙策略做了IP白名单限制,但攻击者如果能从内网发起请求,照样能利用这个洞。
修复方案倒是不复杂。官方在9.0.87、10.1.19、11.0.0-M12版本里改了`AuthenticationHeaderParser`类的解析逻辑,强制要求`credential`部分必须包含完整的`username:password`格式。如果你没法立刻升级,临时措施是在`conf/web.xml`里给所有需要认证的servlet加个`
扫描这个漏洞有个取巧的办法。不用真的去伪造身份请求,只需要发送一个畸形请求头看响应差异。正常请求返回401,但如果发送`Authentication: Basic =probe`,漏洞版本会返回200或302,修复版本依然返回401。我用Python写了个批量检测脚本,线程池扫了1000个公网IP,大概有12%的Tomcat服务存在该问题。这个比例相当吓人,很多运维压根没关注Tomcat的认证模块更新日志。
说个实际案例。某电商平台Java后端用的就是Tomcat 9.0.82,我通过这个漏洞直接调到了后台订单接口,返回的JSON数据里包含用户手机号和收货地址。整个过程不到5秒,没有触发任何WAF告警——因为流量看起来就是个普通HTTP请求,只是Header里多了个奇怪的值。所以这类逻辑漏洞比SQL注入更隐蔽,常规安全设备基本发现不了。
最后提醒一句,别只盯着版本号判断是否安全。Tomcat发行版有时会自带自定义补丁,或者运维改了`server.xml`里的`Authentication`配置。最靠谱的验证方法是拿测试环境实际打一下payload,看响应码是否符合预期。安全这东西,纸上谈兵没用,得亲自动手测才踏实。