【原创缝隙】Adobe ColdFusion 反序列化RCE缝隙分析(CVE-2019-7091)
颁布功夫 2019-02-14缝隙概述
本次缝隙为Adobe ColdFusion中FlashGateway服务中的缝隙。Adobe ColdFusion的FlashGateway服务存在反序列化缝隙,未经身份验证的攻击者向指标Adobe ColdFusion的FlashGateway服务发送精心机关的恶意数据,经反序列化后可远程执行肆意代码。
缝隙功夫轴
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步骤。关键代码如下:
...
//读取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); }
其中,指标执行步骤method通过Method method = this.getMethod(parameters, serviceName, functionName, aClass)得到;步骤执行对象service 通过service = aClass.newInstance()得到;步骤执行参数parameters.toArray()通过MessageBody得到。
由此可见,method.invoke(service, parameters.toArray())的所用参数都可控,意味着可执行肆意步骤。
整个流程如下图所示:
缝隙利用成效
影响版本
ColdFusion 2016 Update 7及之前版本
ColdFusion 2018 Update 1及之前版本
躲避规划
升级最新补丁APSB19-10:https://helpx.adobe.com/security/products/coldfusion/apsb19-10.html。


京公网安备11010802024551号