一客户在阿里云上,采用Apache+Tomcat集群布署华丹快速开发平台。
最近,阿里云应急响应中心监测到CNVD披露 Apache Tomcat 服务器存在文件读取与包含高危漏洞。
漏洞描述:
Apache Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器。默认情况下,Apache Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互。但Apache Tomcat在AJP协议的实现上存在漏洞,导致攻击者可以通过发送恶意的AJP请求,可以读取或者包含Web应用根目录下的任意文件,如果存在文件上传功能,将可以导致任意代码执行。漏洞利用AJP服务端口实现攻击,未开启AJP服务对外不受漏洞影响(tomcat默认将AJP服务开启并绑定至0.0.0.0)。阿里云应急响应中心提醒 Apache Tomcat用户尽快排查AJP端口对外情况并采取安全措施阻止漏洞攻击。
影响版本
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
安全版本
Apache Tomcat 7.0.100
Apache Tomcat 8.5.51
Apache Tomcat 9.0.31
安全建议
以下任意一种方法均可实现漏洞修复
1、升级至安全版本
2、关闭AJP连接器,修改Tomcat的service.xml,注释掉 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />。或者禁止Tomcat 的 AJP端口对公网开放。
3、针对阿里云用户,可使用安全组临时禁止AJP服务端口(常见为8009端口)对外,阻止漏洞攻击。
因为需要AJP与apache进行交互,所以不能采用2、3方案修复。那么只能升级Tomcat从当前版本8.5.26升级到安全版本8.5.63。
升级配置与原来完全相同,但启动TOMCAT报错,错误信息如下:
org.apache.catalina.core.StandardService.startInternal Failed to start connector [Connector[AJP/1.3-8009]]
org.apache.catalina.LifecycleException: 协议处理器启动失败
......
Caused by:
java.lang.IllegalArgumentException: AJP连接器配置secretRequired="true",但是属性secret确实空或者空字符串,这样的组合是无效的。
at org.apache.coyote.ajp.AbstractAjpProtocol.start(AbstractAjpProtocol.java:274)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1100)
...12 more
解决方案也很简单,打开server.xml,在connector段中设置 AJP 协议的认证凭证,即添加secret="TOMCAT_AJP_SECRET6567"即可,注意secrect的值任意,设为一个安全性高、无法被轻易猜解的值。
形如:
<connector
protocol="org.apache.coyote.ajp.AjpNioProtocol"
address="::1"
port="8009"
redirectport="8443"
maxthreads="1200"
uriencoding="UTF-8"
acceptcount="300"
maxpostsize="-1"
connectiontimeout="30000"
minsparethreads="25"
tcpnodelay="ture"
enablelookups="fales"
allowtrace="false"
secret="TOMCAT_AJP_SECRET6567"
/>