WebLogic Java反序列化漏洞终极建议


title: WebLogic Java反序列化漏洞终极建议
author: rocklei123
tags:

  • Java
  • WebLogic
    categories: Spring
    date: 2018-09-25 09:27:33

0. 概述:

本文针对这几年来WebLogic软件经常报出的java反序列化漏洞问题进行总结,其他中间件软件本文暂不讨论。内容主要涵盖客户最关心的一些问题、工程师打补丁时需要注意事项。

1. 序列化与反序列化介绍

Java 序列化与反序列化

  • Java 序列化是指把 Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的 writeObject() 方法可以实现序列化。
  • Java 反序列化是指把字节序列恢复为 Java 对象的过程,ObjectInputStream 类的 readObject() 方法用于反序列化。

WebLogic Java反序列化漏洞终极建议_第1张图片

序列化与反序列化是让 Java 对象脱离 Java 运行环境的一种手段,可以有效的实现多平台之间的通信、对象持久化存储。主要应用在以下场景:

** HTTP: ** 多平台之间的通信,管理等

** RMI:** 是 Java 的一组拥护开发分布式应用程序的 API,实现了不同操作系统之间程序的方法调用。值得注意的是,RMI 的传输 100% 基于反序列化,Java RMI 的默认端口是 1099 端口。

** JMX:** JMX 是一套标准的代理和服务,用户可以在任何 Java 应用程序中使用这些代理和服务实现管理,中间件软件 WebLogic 的管理页面就是基于 JMX 开发的,而 JBoss 则整个系统都基于 JMX 构架。 ​

2016年Spring RMI反序列化漏洞今年比较出名的:Jackson,FastJson
Java 十分受开发者喜爱的一点是其拥有完善的第三方类库,和满足各种需求的框架;但正因为很多第三方类库引用广泛,如果其中某些组件出现安全问题,那么受影响范围将极为广泛。

2. Java反序列化漏洞与Weblogic反序列化漏洞介绍

2.1 Java反序列化漏洞历史

最为出名的大概应该是:15年的Apache Commons Collections 反序列化远程命令执行漏洞,其当初影响范围包括:WebSphere、JBoss、Jenkins、WebLogic 和 OpenNMSd等。

Apache Commons Collections 3和4,Groovy,Spring,只要目标应用的Class Path中包含这些库,可让readObject()实现任意命令执行。影响比较广泛的就是Apache Commons Collections这个库,中间件基本都会涉及使用此库。

2.2 Weblogic Java反序列化漏洞介绍

因为weblogic底层也使用Apache Commons Collections库,WebLogic 存在Java反序列化漏洞无疑的。不过在漏洞修复这方面,Oracle可是不走心啊。正所谓,新三年,旧三年,缝缝补补又三年,还是未修完。以下是基于Weblogic t3协议引起远程代码执行的反序列化漏洞统计:

CVE-2015-4852

CVE-2016-0638

CVE-2016-3510

CVE-2017-3248

CVE-2018-2628

从2015年一直修到2018年,反复修,反复被绕过,基于t3协议的Java反序列化漏洞还在继续。

问:那么为什么Java反序列化漏洞为什么波及范围如此广泛?Weblogic 的java反序列化漏洞未来可能还是会存在吗?

答: (1)因为Apache Commons Collections 这个库使用太广泛了,市面主流中间件、Spring、fastjson 等都使用这个库。

(2)Oracle的Weblogic补丁是采用黑名单的方式过滤危险的反序列化类 ,每次新出现一种漏洞就提供一个新的黑名单,这种方式极不安全的。 一旦黑客发现新的漏洞,绕过这个黑名单就能攻击。详细原因请开大神分析

原因就在下文链接中:

https://paper.seebug.org/333/

Weblogic 反序列化漏洞(CVE-2018-2628)漫谈

3.Weblogic Java 反序列化客户关心的几个问题?

3.1 客户关心的:t3协议是否默认开启?

问题 :大多数WebLogic反序列化漏洞主要是针对T3协议,我们默认是否已经启用此协议?通过什么方法确认?

答 :t3协议默认都是开启的,t3协议是非常重要的WebLogic内部的通讯协议。

3.2 客户关心的:关于配置t3协议过滤器相关问题

因为基本都是基于t3协议造成的Java反序列化问题,且Oracle提供的补丁集合无法完全解决java反序列化问题,官方提供一种临时解决办法就是过滤T3协议,即WebLogicServer 提供了名为weblogic.security.net.ConnectionFilterImpl 的默认连接筛选器,在此连接筛选器上添加过滤规则过滤连接。如果参考 http://www.sohu.com/a/241934306_465935 ,是否起到防护作用,文中配置方式是否正确?

3.2.1 t3过滤器是否起到防护作用?

问题:临时方案是否一定程度的起到预防的作用

答:临时方案在一定程度的起到预防的作用。

3.2.1 能否禁用所有t3协议?

问题 :能否禁用所有t3协议?

** 下文配置方式是错误的配置方式 **

WebLogic Java反序列化漏洞终极建议_第2张图片

答:文中提到的方法是错误的方法。文中提到:筛选规则填取:* * 7001 deny t3 t3s ,此种规则相当于禁用了t3 协议。禁用后会影响到使用t3协议启动的受管节点,WLST监控脚本、停止脚本…等等。

4 Weblogic Java 反序列化问题最终建议

4.1 针对10.3.6 及以上版本建议

  • (1)Oracle每个季度都会更新补丁集合,这个补丁集合不仅包含软件的安全漏洞修复而且包含软件的功能漏洞修复。所以不管怎样,即使没有完全解决反序列化漏洞,打补丁还是很有必要的。至于修复了哪些漏洞建议查bugsfixed 列表

  • (2)推荐Configure Weblogic Connection Filters
    思路:需要禁用t3协议,但是不能禁死,对于受管节点或有需求的特定节点,需要放开限制。见4.3 、4.4

参考官方doc链接(这两篇文档需要买了Oracle服务才可以下载):
Steps to Configure Weblogic Connection Filters ( Doc ID 1508748.1 )

Connection-filter Rules To Allow Few Ips To Access One Port And To Allow All Ips To Access Another Port ( Doc ID 1494692.1 )

参考官方Doc链接:
http://download.oracle.com/docs/cd/E12839_01/web.1111/e13711/con_filtr.htm#i1029357

  • (3)针对bsu升级工具的weblogic版本,建议先升级补丁工具,否则检查冲突时间过程
    WLS BSU (Smart Update) Takes Very Long Time to Apply Patches - Especially When Checking for Patch Conflicts (文档 ID 2271366.1)
    下载补丁集合p25153061_1036_Generic.zip
补丁工具升级
#cd /home/cfmmc/Oracle/Middleware/utils/bsu/
#unzip p25153061_1036_Generic.zip  
# . ./bsu_fix.sh install
回滚
# . ./bsu_fix.sh rollback
  • (4)调整bsu.sh 或bsu.cmd 内存,防止内容溢出
    WL_HOME/utils/bsu 目录,vi bsu.sh
"$JAVA_HOME/bin/java" -Xms2048m -Xmx2048m -jar patch-client.jar $*
  • (5)注意事项

注意事项:临时方案存在一定风险,需要在测试环境严格实测,一旦禁用规则配置错误,可能会导致生产系统启动或调用失败。故内网环境酌情考虑,外网环境系统建议配置。

4.2 针对weblogic 1036以下版本解决建议

按照oracle官网所说8和9、10版本没有反序列漏洞,但是实际中,如果在应用中含’commons.collections’的jar包,还是会在安全软件中扫描出反序列化漏洞。

** 非官方 ** 的修复方式有如下两种方法:

  • (1)下载Apache官方最新的commons-collections包,替换有漏洞的commons-collections组件
    地址:http://commons.apache.org/proper/commons-collections/download_collections.cgi

  • (2)调整应用程序,使用SerialKiller类包替换进行反序列化操作的ObjectInputStream类。
    下载jar包和实施步骤请参考链接:https://github.com/ikkisoft/SerialKiller

** 题外话:不过运维人员还是不要背这颗雷吧,生产环境复杂,真出了事故我们付不起责任,更何况国企的企业政治复杂,就别把自己置于水火之中了。我们只提供建议,让甲方人员决定吧! **

4.3 Connection Filters规则示例及解读

一般写法示例(第二、第三个域用*号代替,意在简化配置,用户可根据自己的需要进行精准的控制,必须填写端口信息):

127.0.0.1 * * allow

10.1.34.205 * * allow

10.156.0.57/255.255.255.0 * * allow 或 10.156.0.57/24 * * allow

0.0.0.0/0 * * deny t3 t3s

解读
第一条(127.0.0.1 * * allow)表示允许本机回环地址所有协议的连接
第二条(10.10.5.68 * * allow)表示允许来自10.10.5.68地址任何协议的访问请求
第三条(10.10.3.0/255.255.255.0 * * allow)表示允许10.10.3.0网段所有协议的连接,
最后一条(0.0.0.0/0 * * denyt3 t3s)表示禁止除上面三条规则以外所有IP地址或网段t3、t3s协议的连接。

4.4 Connection Filters规则示例2

** 目标 **

The Admin server is running on port 8001 and the application is deployed on Managed
server, on port 7001
The purpose is that only 4 IPs should be able to access the console and no one else
should be allowed to access the console but all the IPs, internal or external, should have
access on the application

** 错误配置 **

10.1.34.205 * 8001 allow
10.156.0.57 * 8001 allow
10.156.0.58 * 8001 allow
0.0.0.0/0 * 7001 allow
0.0.0.0/0 * * deny

** 正确配置 **

10.1.34.205 * 8001 allow
10.156.0.57 * 8001 allow
10.156.0.58 * 8001 allow
* * 8001 deny

Make use of * instead of 0 (0.0.0.0/0)

"The default connection filter implementation interprets a target address of 0 (0.0.0.0/0)
as meaning "the rule should apply to all IP addresses."By design, the default filter does
not evaluate the port or the local address, just the action. To clearly specify restrictions
when using the default filter, modify the rules.
Another option is to implement a custom connection filter.

5 参考

田东云 -【无效的安全补丁】说说WebLogic那修不完的Java反序列化漏洞

王德富 -Weblogic之反序列化高危漏洞

6.其他博文

CVE-2015-4852 java 反序列化漏洞–weblogic补丁

7.欢迎关注米宝窝,持续更新中,谢谢!

米宝窝 https://rocklei123.github.io/

你可能感兴趣的:(Weblogic)