转载

VMware更新Apache Flex BlazeDS中的漏洞

VMware发布了数个产品的版本更新,目的是修复Apache Flex BlazeDS中的一个漏洞。

据VMware介绍,Flex BlazeDS组件应用在数个公司产品中,但是其上存在XML外部实体(XXE)漏洞,可被攻击者远程利用,发送一条特制的XML请求,服务器便会泄露信息。

FreeBuf百科:BlazeDS

BlazeDS是一个基于服务器的Java远程调用(remoting)和web消息传递(messaging)技术,使得后台的Java应用程序可以和运行在浏览器上的Flex应用程序能够互相通信。简单来说一个BlazeDS应用包括客户端(Flex或AIR应用程序)和一个服务端(J2EE程序)。BlazeDS在期间起着承上启下的作用,Flex和BlazeDS可以通过RemoteObject,HttpService,WebService三种。

受影响的产品

该漏洞对VMware vCenter Server 5.0、5.1、5.5,vCloud Director 5.5、5.6,Horizon View 5.0、6.0均有影响。

但随着VMware vCenter Server 5.0u3e、5.1u3b 、5.5u3,vCloud Director 5.5.3、5.6.4,Horizon View 5.3.4、6.1新版本的更新,问题已被解决。vCenter Server 6.0不受影响。

Apache Flex BlazeDS漏洞(CVE-2015-3269)存在于BlazeDS远程/AMF协议实现中,是Matthias Kaiser于8月份发现,并在其博客中发布了 漏洞的细节和利用方法 。

漏洞细节

AMF消息包括头部和主体两部分。为了解析AMF主体,需要调用AmfMessageDeserializer 的method readBody()。Method可以读取目标URI、响应URI和主体的长度。随后,method readObject()也会被调用。

/*     */   public void readBody(MessageBody body, int index) /*     */     throws ClassNotFoundException, IOException /*     */   { /* 158 */     String targetURI = amfIn.readUTF(); /* 159 */     body.setTargetURI(targetURI); /* 160 */     String responseURI = amfIn.readUTF(); /* 161 */     body.setResponseURI(responseURI); /*     */      /* 163 */     amfIn.readInt(); /*     */      /* 165 */     amfIn.reset(); /*     */      /*     */  /* 168 */     if (isDebug) { /* 169 */       debugTrace.startMessage(targetURI, responseURI, index); /*     */     } /*     */     Object data; /*     */     try { /* 173 */       data = readObject(); /*     */     } /*     */     catch (RecoverableSerializationException ex) /*     */     { /* 177 */       ex.setCode("Client.Message.Encoding"); /* 178 */       data = ex; /*     */     } /*     */     catch (MessageException ex) /*     */     { /* 182 */       ex.setCode("Client.Message.Encoding"); /* 183 */       throw ex; /*     */     } /*     */      /* 186 */     body.setData(data); /*     */      /* 188 */     if (isDebug) { /* 189 */       debugTrace.endMessage(); /*     */     } /*     */   } /*     */    /*     */  /*     */  /*     */  /*     */   public Object readObject() /*     */     throws ClassNotFoundException, IOException /*     */   { /* 199 */     return amfIn.readObject(); /*     */   } /*     */ }

Amf0Input例子中,object的type是从下一个字节中读取的。如果type的值是15,下面主体的字节就会以method readXml()解析。

/*     */   public Object readObject() /*     */     throws ClassNotFoundException, IOException /*     */   { /*  91 */     int type = in.readByte(); /*     */      /*  93 */     Object value = readObjectValue(type); /*  94 */     return value; /*     */   } /*     */    /*     */   protected Object readObjectValue(int type) throws ClassNotFoundException, IOException /*     */   { /*  99 */     Object value = null; /* 100 */     switch (type) /*     */     { /*     */     case 0:  /* 103 */       value = Double.valueOf(readDouble()); /* 104 */       break; /*     */        ... /*     */      /*     */     case 15:  /* 147 */       value = readXml(); /* 148 */       break; /*     */       .... /*     */   protected Object readXml() throws IOException /*     */   { /* 511 */     String xml = readLongUTF(); /*     */      /* 513 */     if (isDebug) { /* 514 */       trace.write(xml); /*     */     } /* 516 */     return stringToDocument(xml); /*     */   } /*     */ 
/*     */  /*     */   public static Document stringToDocument(String xml, boolean nameSpaceAware) /*     */   { /* 116 */     ClassUtil.validateCreation(Document.class); /*     */      /* 118 */     Document document = null; /*     */     try /*     */     { /* 121 */       if (xml != null) /*     */       { /* 123 */         StringReader reader = new StringReader(xml); /* 124 */         InputSource input = new InputSource(reader); /* 125 */         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); /* 126 */         factory.setNamespaceAware(nameSpaceAware); /* 127 */         factory.setValidating(false); /* 128 */         DocumentBuilder builder = factory.newDocumentBuilder(); /*     */          /* 130 */         document = builder.parse(input); /*     */       } /*     */     } /*     */     catch (Exception ex) /*     */     { /* 135 */       throw new MessageException("Error deserializing XML type " + ex.getMessage()); /*     */     } /*     */      /* 138 */     return document; /*     */   } /*     */ }

利用方法

利用起来非常的简单,只需发送一条XXE向量。

VMware更新Apache Flex BlazeDS中的漏洞

Apache在 Flex BlazeDS 4.7.1版本中修复了该漏洞,在此之前的所有版本均受影响。

* 参考来源 securitywee ,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

正文到此结束
Loading...