【原创缝隙】Adobe ColdFusion 反序列化RCE缝隙分析(CVE-2019-7091)

颁布功夫 2019-02-14

缝隙概述


2019年2月12日,,Adobe官方颁布了针对Adobe ColdFusion的安全更新补丁,,编号为APSB19-10。。。补丁中蕴含OG东方厅ADLab发现并第一功夫提交给官方的Critical(危机)反序列化缝隙,,利用该缝隙攻击者可远程执行肆意代码。。。缝隙编号为CVE-2019-7091,,如下图所示:::


OG东方厅·(中国大陆)


本次缝隙为Adobe ColdFusion中FlashGateway服务中的缝隙。。。Adobe ColdFusion的FlashGateway服务存在反序列化缝隙,,未经身份验证的攻击者向指标Adobe ColdFusion的FlashGateway服务发送精心机关的恶意数据,,经反序列化后可远程执行肆意代码。。。

缝隙功夫轴


2018年9月21日:::将缝隙详情提交给官方;
2018年12月5日:::确认缝隙存在并起头修复;
2019年2月12日:::官方颁布正式补丁。。。

缝隙分析


Adobe ColdFusion的FlashGateway服务允许flash衔接到CFML和CFC模板。。。当攻击者通过HTTP和谈向FlashGateway服务POST精心机关的ActionMessage信息后,,FlashGateway服务顺次通过各种类型的filter进行invoke()操作。。。在flashgateway.filter.SerializationFilter的invoke步骤中,,实例化MessageDeserializer类型的反序列工具deserializer并通过deserializer.readMessage(m)步骤对精心机关的ActionMessage新闻进行反序列化,,同时将ActionMessage中的targetURI 、、、data等值赋值给MessageBody。。。


实现序列化过程后,,此时ActionContext context中的内容即为输入流中精心机关的ActionMessage信息。。。在flashgateway.filter.AdapterFilter的invoke步骤中,,读取ActionContext中的MessageBody信息赋值给serviceName 、、、functionName 、、、parameters等,,通过adapter=locateAdapter(context, serviceName, functionName, parameters, serviceType)步骤得到flashgateway.adapter.java.JavaBeanAdapter类型的adapter,,而后执行JavaBeanAdapter的invokeFunction步骤。。。关键代码如下:::


public ActionContext invoke(ActionContext context) throws  Throwable {
        ...
      //读取MessageBody信息
      MessageBody  requestMessageBody = context.getRequestMessageBody();
      String serviceName  = requestMessageBody.serviceName;
      String  functionName = requestMessageBody.functionName;
      List parameters = requestMessageBody.parameters;
        ...
     if  (context.isDescribeRequest()) {
      result = adapter.describeService(context,  serviceName);
     } else {
  //adapter为JavaBeanAdapter,,执行flashgateway.adapter.java.JavaBeanAdapter的invokeFunction步骤

    result =  adapter.invokeFunction(context, serviceName, functionName, parameters); }


在JavaBeanAdapter的invokeFunction步骤中,,看到关键代码:::method.invoke(service, parameters.toArray())。。。


OG东方厅·(中国大陆)


其中,,指标执行步骤method通过Method method = this.getMethod(parameters, serviceName, functionName, aClass)得到;步骤执行对象service 通过service = aClass.newInstance()得到;步骤执行参数parameters.toArray()通过MessageBody得到。。。


由此可见,,method.invoke(service, parameters.toArray())的所用参数都可控,,意味着可执行肆意步骤。。。


整个流程如下图所示:::


OG东方厅·(中国大陆)

缝隙利用成效

OG东方厅·(中国大陆)

影响版本


ColdFusion 11 Update 15及之前版本
ColdFusion 2016 Update 7及之前版本
ColdFusion 2018 Update 1及之前版本

躲避规划


批改gateway-config.xml文件的配置,,不容JavaBeanAdapter的使用。。。

升级最新补丁APSB19-10:::https://helpx.adobe.com/security/products/coldfusion/apsb19-10.html。。。


OG东方厅·(中国大陆)