记录日期:2021/5/21

1. 安全问题分析

在做服务器安全扫描时,有时会报出 jetty 的漏洞。
在这里插入图片描述
查看漏洞详情可知,低版本的 jetty 包含漏洞,升级 jetty 到新版本就可以修复这些漏洞。

漏洞官方问题连接修复版本
Eclipse Jetty HTTP请求走私漏洞(CVE-2017-7656)https://bugs.eclipse.org/bugs/show_bug.cgi?id=5356679.3.24.v20180605 9.4.11.v20180605
Eclipse Jetty 输入验证错误漏洞(CVE-2018-12545)https://bugs.eclipse.org/bugs/show_bug.cgi?id=5380969.4.12
Eclipse Jetty 授权问题漏洞(CVE-2018-12538)https://bugs.eclipse.org/bugs/show_bug.cgi?id=5360189.4.9.v20180320
Jetty 信息泄露漏洞(CVE-2017-9735)https://github.com/eclipse/jetty.project/issues/1556 https://github.com/gwtproject/gwt/issues/95679.4.6.v20170531 9.3.20.v20170531 9.2.22.v20170606
Eclipse Jetty HTTP请求走私漏洞(CVE-2017-7658)https://bugs.eclipse.org/bugs/show_bug.cgi?id=5356699.2.25.v20180606 9.3.24.v20180605 9.4.11.v20180605
Eclipse Jetty信息泄露漏洞(CVE-2018-12536)https://bugs.eclipse.org/bugs/show_bug.cgi?id=5356709.3.24.v20180605 9.4.11.v20180605
Eclipse Jetty 信息泄露漏洞(CVE-2019-10247)https://bugs.eclipse.org/bugs/show_bug.cgi?id=5465779.2.28.v20190418 9.3.27.v20190418 9.4.17.v20190418
Eclipse Jetty 信息泄露漏洞(CVE-2019-10246)https://bugs.eclipse.org/bugs/show_bug.cgi?id=5465769.2.28.v20190418 9.3.27.v20190418 9.4.17.v20190418
Eclipse Jetty跨站脚本执行漏洞(CVE-2019-10241)https://bugs.eclipse.org/bugs/show_bug.cgi?id=5461219.2.27.v20190403 9.3.26.v20190403 9.4.16.v20190411

分析完以上漏洞,只要将 jetty 版本升级到 9.4.17 及以上,可以修复以上所有安全漏洞。

(注意:应该避免使用 v9.4.27-v9.4.29,这 3个版本含有已知的漏洞 “Eclipse Jetty 安全漏洞(CVE-2019-17638)”)

2. 升级验证

jetty 升级过程这里不做介绍。假设顺利升级至 9.4.17。

启动Jetty后,通过下面命令访问网站,检查服务器返回信息:

$ curl -I http://localhost:3000

查看服务器返回信息
在这里插入图片描述
发现服务器返回的 Jetty 版本是 9.4.z-SNAPSHOT,安全扫描还是会检测到版本不安全,报出漏洞。
在这里插入图片描述

3. Jetty版本不准确问题分析

出现上面的问题很奇怪,我们明明已经升级到了 9.4.17,为什么服务器返回的是 9.4.z。查看 Jetty 官网 Issue 发现,这是 Jetty-9.4.20 以下版本的一个 bug。https://github.com/eclipse/jetty.project/issues/3918

升级到 9.4.20 及以上版本后,服务器返回准确版本。

4. Jetty版本不准确的临时解决方案

如果想继续使用 Jetty 9.4.17(因为这个版本实际并没有安全漏洞,只是由于服务器返回版本不准确,导致安全扫描工具误报),有什么办法吗?

查看 Jetty 源码
在这里插入图片描述
9.4.20 之前的代码逻辑,首先尝试从 package 中获取版本号,取不到后从系统参数中取 jetty.version,如果系统参数中没有,就使用默认值 9.4.z-SNAPSHOT

因此,可以在启动 Jetty 时增加系统参数解决 jetty.version=9.4.17.v20190418

(添加系统参数的方法,可以让服务器返回指定的 Jetty 版本号。那么,回到问题的开始,如果我们不升级 jetty 版本,只是在启动 jetty 时通过添加一个假的、高的版本号,其实也可以让扫描软件不报错。)

5. 应用例子

案例 1:metabase

metabase 是一个开源报表工具,其中内嵌了 jetty。

  • Metabase v0.34.x 内嵌的 Jetty 9.4.15.v20190215
  • Metabase v0.35.x – v0.36.7 内嵌的 Jetty 9.4.27 v20200227
  • Metabase v0.36.8 – v0.39.x 内嵌 Jetty 9.4.32.v20200930

如果使用 metabase v0.36.8 及以上,不存在安全漏洞。否则,会报安全漏洞。启动时设置个假的版本号,可以避免安全扫描工具报错。

$ java -Djetty.version=9.4.30.v20200611 -jar metabase.jar

案例 2:jenkins

Jenkins 是常用的持续构建工具,内嵌了 jetty 作为应用服务器。

以 Jenkins v2.277.4 版本(内嵌的 jetty 版本是 9.4.39.v20210325)为例,启动 Jenkins

$ java -jar Jenkins.war

访问jenkins站点,查看 jetty 版本,返回 9.4.39.v20210325
在这里插入图片描述
启动命令中加上 jetty.version 参数后,启动

$ java -Djetty.version=9.4.17 -jar Jenkins.war

访问jenkins站点,查看 jetty 版本。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐