CNVD-C-2019-48814 WebLogic反序列化远程命令执行漏洞

Posted jack-yyj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CNVD-C-2019-48814 WebLogic反序列化远程命令执行漏洞相关的知识,希望对你有一定的参考价值。

漏洞信息       
漏洞名称:OracleWebLogic wls9-async反序列化远程命令执行漏洞(CNVD-C-2019-48814)

影响版本:- WebLogic 10.x   

                  - WebLogic 12.1.3 

此漏洞影响启用bea_wls9_async_response组件及wls-wsat组件的所有Weblogic版本。

漏洞评级:高危

漏洞简介:

WebLogic Server是美国甲骨文(Oracle)公司开发的一款适用于云环境和传统环境的应用服务中间件,它提供了一个现代轻型开发平台,支持应用从开发到生产的整个生命周期管理,并简化了应用的部署和管理。

该漏洞是存在于weblogic自带的wls9_async_response.war组件及wls-wsat组件中,在反序列化处理输入信息时存在缺陷,攻击者可以发送精心构造的恶意HTTP 请求,未授权的情况下远程执行命令。部分版本WebLogic中默认包含的wls9_async_response包,主要是为WebLogic Server提供异步通讯服务。

漏洞分析:

我们知道漏洞存在于wls9_async_response.war 这个包里面。那我们来看一下这个包。

wls9_async_response组件情况:

首先看一下bea_wls9_async_response.war!/WEB-INF/web.xml 内容,我们发现这里的所有请求都是交给weblogic.wsee.async.AsyncResponseBean 方法继续处理。

而在bea_wls9_async_response.war!/WEB-INF/weblogic-webservices.xml 文件中,这里定义了目前流传的一些poc请求路径。


那这里需要跟进一下 weblogic.wsee.async.AsyncResponseBean 这个方法,这个方法的位置在/weblogic.jar!/weblogic/wsee/async/AsyncResponseBean.class ,头部import的包如下所示:

这里关注到了几个soap相关的包,从公布的poc中可知触发原因应该是由于soap注入引起的反序列化漏洞,但是在 AsyncResponseBean 中只有 handleFault和handleResult 方法。跟进这两个方法确实没有找到反序列化相关的触发点,因为看poc很像 CVE-2017-10271(XMLDecoder反序列化漏洞)。

进一步分析:

在Servlet拦截器下个断点,位置在weblogic.jar!/weblogic/wsee/server/servlet/BaseWSServlet.class,从前的import包中可知应该与soap有关系。

跟进一下 weblogic.jar!/weblogic/wsee/server/servlet/SoapProcessor.class

继续跟入 getMethod 方法,

跟到了 weblogic.jar!/weblogic/servlet/internal/ServletRequestImpl.class

继续跟入 getRequestParser方法,

位置在weblogic.jar!/weblogic/servlet/internal/ServletRequestImpl.class

继续跟进,来到weblogic.wsee.server.servlet.SoapProcessor#process中。

然后一直跟进,跟进到

weblogic.jar!/weblogic/wsee/ws/dispatch/server/ServerDispatcher.class的第85行

继续跟进到 weblogic.jar!/weblogic/wsee/ws/dispatch/server/ServerDispatcher.class的第93行,跟进handleRequest(weblogic.jar!/weblogic/wsee/handler/HandlerIterator.class) ,在下面代码处下个断点。

Handler var4 = this.handlers.get(this.index)

这里有很多 handler,最感兴趣的是 AsyncResponseHandler 。

但是随着进一步的step into,发现触发点并不是这里。

跟进到了 WorkAreaServerHandler 这个handler之后,发现了新大陆。

WorkAreaServerHandler(weblogic.jar!/weblogic/wsee/workarea/WorkAreaServerHandler.class),这里会从我们提交的poc中获取数据。


跟进一下 receiveRequest 方法,

位置在wlclient.jar!/weblogic/workarea/WorkContextLocalMap.class中。

继续跟进一下 readEntry ,

位置在wlclient.jar!/weblogic/workarea/spi/WorkContextEntryImpl.class中。

跟进一下 readUTF ,位置在weblogic.jar!/weblogic/wsee/workarea/WorkContextXmlInputAdapter.class,结果出来了。

果然是 xmlDecoder 发序列化,我们在这里下一个断点,最后看一下调用链。


此漏洞分析来源:http://www.lmxspace.com/

Weblogic内存溢出及常用参数配置

   

http://www.360doc.com/content/14/0306/14/16134804_358216319.shtml


一、WebLogic内存溢出

最近访问量门户访问量突然增大,总是内存溢出,频繁宕机,调整了很多参数没起作用,偶然发现Weblogic域在不断增大,罪魁祸首竟然是Weblogic的诊断文件,也是造成Weblogic内存溢出的主要原因。当Weblogic启动时就加载了每个Server上的诊断文件,占用了大部分内存分配,用户访问量越大这个文件也随之越大,将他删除后重新启动服务,八个Server竟然也只用了6分钟,部署项目也只需7,8分钟,一直平稳运行,再无内存溢出现象。

该文件地址:/bea/user_projects/domains/{domain_name}/servers/{Server_name}/data/store/diagnostics/*.DAT

(注:AdminServer下该诊断文件为1M左右正常)

 

但是该文件还会继续生成增大,我们的域中并没有配置相关启动诊断文件的设置,Bea售后也无法解释,但可以通过尝试增加启动参数(-Dcom.bea.wlw.netui.disableInstrumentation=true

)来控制该诊断文件的增长,在/bea/user_projects/domains/{domain_name}/bin/startWebLogic.sh中:

if [ "${WLS_REDIRECT_LOG}" = "" ] ; then

    echo "Starting WLS with line:"

echo "${JAVA_HOME}/bin/java ${JAVA_VM} ${MEM_ARGS} ${JAVA_OPTIONS} -Dcom.bea.wlw.netui.disableInstrumentation=true   -Dweblogic.Name=${SERVER_NAME} -Djava.security.policy=${WL_HOME}/server/lib/weblogic.policy  ${PROXY_SETTINGS} ${SERVER_CLASS}"

  ${JAVA_HOME}/bin/java ${JAVA_VM} ${MEM_ARGS} ${JAVA_OPTIONS} -Dcom.bea.wlw.netui.disableInstrumentation=true  -Dweblogic.Name=${SERVER_NAME} -Djava.security.policy=${WL_HOME}/server/lib/weblogic.policy ${PROXY_SETTINGS} ${SERVER_CLASS}

else

    echo "Redirecting output from WLS window to ${WLS_REDIRECT_LOG}"

${JAVA_HOME}/bin/java ${JAVA_VM} ${MEM_ARGS} ${JAVA_OPTIONS} -Dcom.bea.wlw.netui.disableInstrumentation=true  -Dweblogic.Name=${SERVER_NAME} -Djava.security.policy=${WL_HOME}/server/lib/weblogic.policy ${PROXY_SETTINGS} ${SERVER_CLASS}  >"${WLS_REDIRECT_LOG}" 2>&1

该参数控制netui的诊断文件的生成。

 

同时,可以在/bea/user_projects/domains/{domain_name}/bin/setDomainEnv.sh中设置GC日志的打印参数分析:

MEM_ARGS=”-Xms2048m –Xmx2048m –verbosegclog:gc.log”

Export MEM_ARGS

该参数会在/bea/user_projects/domains/{domain_name}/下输出gc.lgo

 

 

二、Portal Domain 调整

Domain目录/bin/setDomainEnv中,如下参数:

 

标志

生产模式设置

说明

DOMAIN_PRODUCTION_MODE

true

该参数决定Domain是否在生产环境下运行,可以在创建Domain时选择运行模式,也可以手工调整这个参数

IterativeDevFlag

false

是否自动编译

DebugFalg

false

是否启用调试器

TestConsoleFlag

False

支持JMS测试工具

LogErrorsToConsoleFlag

False

是否向屏幕输出error日志

verboseLogginFlag

False

是否输出Debug日志

PointbaseFlag

False

是否自动启动Pointbase

三、Weblogic 常用参数配置

 

序号

项目

内容

描述

参考值

附图

1

Domain>

Environment>

Cluster>

General>

Default Load Algorithm:

设置集群负载均衡策略

Round-robin:循环

Weight-based:权重(配置此种策略要针对没各Server配置想用的权重,见2)

Random:随机

Round-robin-affinity/

Weight-based-affinity/

Random-affinity这三个参数针对硬件做前端负载均衡设置

图一

2

Domain>

Environment>

Servers>

ManagedServer>

Cluster>

Cluster Weight:

设置 每个Managed Server的分发权重

默认100,设置占100的百分比

图二

3

Domain>

Environment>

Servers>

Server>

Logging>

Stdout Serverity Threshold:

记录日志的级别

Error

图三

 

 

Rotation Type:

Minimum File Size

日志滚动的类型

产生新日志文件大小

By Size

5000k

 

 

 

 

Limit number of retained files

Log Files To Retain:[n]

限制保留的日志文件数

 

要保留的日志文件个数

 选择

 

10

 

4

Domain>

 Connection Pools>

 Configuration>

  Connections

Initial Capacity:

Maximum Capacity:

设置初始容量

最大容量

建议初始容量和最大容量设置成相等值,并要考虑并发访问数据库的线程数来调整参数

 

5

Domain>

 Connection Pools>

 Configuration>

  Connections

URL

集群数据库URL设置方法

例如:jdbc:oracle:thin:@

(description=

(address_list=(address=(host=scdb1_vip)

(protocol=tcp)(port=1521))

(address=(host=scdb2_vip)

(protocol=tcp)(port=1521))

(load_balance=yes)

(failover=yes))

(connect_data=(service_name=scdb)))

 

Weblogic.xml中的参数:

集群环境部署参数(集群单机环境都可用):

   

    replicated_if_clustered

    true

  

   自动编译检测时间

  

    60

  

  

    60

  

 

三、集群项目部署报错及解决

集群环境项目部署,总会出现版本不一致,造成的部署失败或部署非常慢,部署报错信息:

Failure occured in the execution of deployment request with ID ‘116857440499‘ for task ‘2‘. 
Error is: ‘weblogic.management.DeploymentException: J2EE:160149Error while processing library references. 
Unresolved application library references, defined in weblogic-application.xml: 
Extension-Name: beehive-controls-1.0, Specification-Version: 1, Implementation-Version: 1.0, exact-match: false,
Extension-Name: weblogic-controls-1.0, Specification-Version: 1, Implementation-Version: 1.0, exact-match: false,
Extension-Name: wls-commonslogging-bridge, Specification-Version: 1, Implementation-Version: 1.0, exact-match: false.‘ 
weblogic.management.DeploymentException: J2EE:160149Error while processing library references. 
Unresolved application library references, defined in weblogic-application.xml: 
Extension-Name: beehive-controls-1.0, Specification-Version: 1, Implementation-Version: 1.0, exact-match: false,
Extension-Name: weblogic-controls-1.0, Specification-Version: 1, Implementation-Version: 1.0, exact-match: false,
Extension-Name: wls-commonslogging-bridge, Specification-Version: 1, Implementation-Version: 1.0, exact-match: false.

......

解决办法:

将weblogic上所有的类库不仅发不到Cluster中还要同时发布到AdminServer上,改变所有类库的Target,如图












以上是关于CNVD-C-2019-48814 WebLogic反序列化远程命令执行漏洞的主要内容,如果未能解决你的问题,请参考以下文章

漏洞预警Oracle WebLogic wls9-async组件存在反序列化远程命令执行漏洞预警通告

未找到 Weblogic 12.1.3 PrivilegedActions 类

Weblogic内存溢出及常用参数配置

eclipse插件安装的四种方法

weblogic 12c web部署注意的问题

weblogic补丁下载与安装补丁的方法