【原创误差】Adobe ColdFusion 反序列化RCE误差剖析(CVE-2019-7091)

宣布时间 2019-02-14

误差概述


2019年2月12日  ,Adobe官方宣布了针对Adobe ColdFusion的清静更新补丁  ,编号为APSB19-10。补丁中包括尊龙凯官网入口ADLab发明并第一时间提交给官方的Critical(危急)反序列化误差  ,使用该误差攻击者可远程执行恣意代码。误差编号为CVE-2019-7091  ,如下图所示:


尊龙凯时 - 人生就是搏!


本次误差为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())。


尊龙凯时 - 人生就是搏!


其中  ,目的执行要领method通过Method method = this.getMethod(parameters, serviceName, functionName, aClass)获得;要领执行工具service 通过service = aClass.newInstance()获得;要领执行参数parameters.toArray()通过MessageBody获得。


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


整个流程如下图所示:


尊龙凯时 - 人生就是搏!

误差使用效果

尊龙凯时 - 人生就是搏!

影响版本


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。


尊龙凯时 - 人生就是搏!