0%

jenkins修复最新Apache Struts远程代码执行漏洞(CVE-2016-1000031)

修复问题描述

阿里云上的安全监测提示:
近日,Apache软件基金会(ASF)向Apache Struts项目管理员发布了关于CVE-2016-1000031漏洞的安全公告,其中披露一个Commons FileUpload库的历史高危漏洞CVE-2016-1000031,而2.3.x系列版本的Apache Struts2仍在使用低版本的Commons FileUpload库,该库作为Struts2的一部分,被用作文件上传的默认机制,远程攻击者利用该漏洞可直接获得服务器权限。2.5.12以上版本的Struts2暂不受影响。
注意:java类web应用的修复一般都需要重启应用
方案一:
升级至2.5.18及以上版本的Struts2,官方下载链接:https://struts.apache.org/download.cgi
方案二:
升级Struts2依赖的Commons FileUpload库版本至最新1.3.3,官方下载地址:https://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi

我这里是思路就是采用方案二。

怎么修复

整体思路很简单,下载源代码,修改需要升级的引用包版本,重新编译构建发布。
1、clone jenkins的源代码到本地,修改引用包的版本。这里直接用我的结果即可,文件为jenkins/core/pom.xml

1
2
3
4
5
6
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
<!--<version>1.3.3-jenkins-2</version> -->
</dependency>

2、编译。

1
2
cd "代码路径"
mvn clean package -pl war -am -DskipTests -Dfindbugs.skip -X

编译过程如果不顺利,或下载不下来文件,自己百度处理。
当然,也可以参考jenkins源码编译和打包(20180408更新) 中的部分步骤,像nodeys的没有就不操作。自己搭建私有库,我是现成的。不自己搭建的话,估计问题也不会太大。

3、踩过的坑。版本问题,编译的版本一定要和当前的版本保持一致,至少不能跳大版本,否则启动不起来,甚至会有各种意想不到的问题。版本一致就顺风顺水。

当然还有一种修复思路,直接替换.jenkins/war/WEB-INF/lib 下面的包,用新包ommons-fileupload-1.3.3.jar换旧包(commons-fileupload-1.3.1-jenkins-2.jar),新包用旧包命名,重启。(阿里云扫描不出来你修复了,大概是扫描它记录的是文件路径吧,我是换过的,重起服务,扫不出来修复了,比较尴尬)。

当然,如果阁下运气好和我用的是一个版本,2.176,那直接下载就可以了。

最后

由于够不着jenkins的维护的资格,所以去issue提交了个bug建议修复pom.xml(要墙)。
https://issues.jenkins-ci.org/browse/SECURITY-1463?filter=-2