1.Tomcat漏洞介绍
使用 Apache Tomcat 软件了 Java Servlet,JavaServer 页,Java 表达式语言和 Java 的 WebSocket 技术的一个开源实现。Java Servlet,JavaServer Pages,Java Expression Language和Java WebSocket规范是在Java Community Process下开发的 。
阿粉相信大家现在用什么版本的多有,从7.0到目前最新的10.0的用什么版本的都有,但是现在,Tomcat出现了重大的漏洞。而此次的漏洞涉及到的版本也是挺多的。
影响的版本有:
- Apache Tomcat 9.x < 9.0.31
- Apache Tomcat 8.x < 8.5.51
- Apache Tomcat 7.x < 7.0.100
- Apache Tomcat 6.x
也就是说此次受影响的版本包括:Tomcat 6,Tomcat 7的7.0.100以下版本,Tomcat 8的8.5.51以下版本,Tomcat 9的9.0.31以下版本。而阿粉线上的版本确实8.5.24,也在漏洞范围之内。
2020年1月6日,国家信息安全漏洞共享平台(CNVD)收录了由北京长亭科技有限公司发现并报送的Apache Tomcat文件包含漏洞(CNVD-2020-10487,对应CVE-2020-1938)。攻击者利用该漏洞,可在未授权的情况下远程读取特定目录下的任意文件。而 CNVD 也将此次漏洞定义为高危漏洞。
2.漏洞情况分析
从 CNVD 接收到长亭公司报送的Apache Tomcat文件包含漏洞开始,就开始了一轮的检测,经检测,Tomcat AJP协议由于存在实现缺陷导致相关参数可控,不得不说,这次漏洞攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件。若服务器端同时存在文件上传功能,攻击者可进一步实现远程代码的执行。
webapp 文件夹,相信大家是非常的熟悉,很多线上项目都是直接把自己本身的项目 War 包发布到 webapps 目录下,这样也就导致了大家的源码,如果有黑客把这个作为漏洞进行攻击的话,那么一定会获取到你们的项目源码,再通过一定的手段进行反编译,那么项目的内容将没有任何秘密可言了,想想多么可怕。
而他是通过什么来获取的,据悉,该漏洞被追踪为CVE-2020-1938,位于Apache Tomcat软件的AJP协议中,允许未经身份验证的黑客远程访问服务器上部署的应用程序和源代码文件。
既然漏洞是位于 AJP 协议中,那么我们首先得了解一下什么是 AJP 协议。
AJP协议
AJP(Apache JServ Protocol)是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。WEB服务器通过 TCP连接 和 SERVLET容器连接。这是百度百科,也就是官方的解释,那么在 Tomcat 中 AJP 协议又是在哪些地方上呢?
阿粉相信大家都改过 Tomcat 的端口号吧,比如8080 改成 8088,然后8009改成 8099 这种的,但是大家有没有仔细的去看 server.xml 文件里面的注释呢?
上面的这幅图,很明显这是基于 HTTP 1.1 的 Connector 而这个 Connector 简单来说就是一个连接器,有了这个,Tomcat 才能成为一个 web 服务器,但还额外可处理Servlet和jsp。
那么在看下面这幅图,注意看注释呦!
Define an AJP 1.3 Connector on port 8009 这一句话直译的意思就是在端口8009上定义AJP 1.3连接器,也就是说这端口是基于 AJP 协议的,但是很多人都知道 HTTP 协议,是因为 8080 端口的存在,而基于 AJP 协议的 AJP1.3 的 Connector ,它使用的是 AJP 协议,使用二进制格式来传输可读性文本的协议。
如果大家真的对 AJP 协议真的感兴趣的话,那么大家可以去 Tomcat 的官网上去看一下 【https://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html】,这个官方文档里面写明了 AJP 协议的设计目标,概述,还有关于一些请求的内容等等。
3.有了漏洞我们应该怎么处理呢?
- 一个最简单的办法,更换 Tomcat 的版本,也就是说你没有使用 AJP 协议的 Tomcat 的话,可以直接将 Tomcat 升级到 9.0.31、8.5.51或 7.0.100 版本进行漏洞修复。
如无法立即进行版本更新、或者是更老版本的用户,建议直接关闭AJPConnector,或将其监听地址改为仅监听本机localhost。
具体操作:
- 编辑 tomcat目录下的/conf/server.xml,找到如下行:
- <Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
直接把这一行注释掉就OK了,保存后需重新启动,规则方可生效。
- 如果使用了Tomcat AJP协议:建议将Tomcat立即升级到9.0.31、8.5.51或7.0.100版本进行修复,同时为AJP Connector配置secret来设置AJP协议的认证凭证。例如(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被轻易猜解的值):<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>
如无法立即进行版本更新、或者是更老版本的用户,建议为 AJP Connector 配置 requiredSecret 来设置AJP协议认证凭证。
文章参考
https://www.cnvd.org.cn/webinfo/show/5415 CNVD(国家信息安全漏洞共享平台)