7月7日,Apache Struts 发布最新的安全公告,Struts2 存在远程命令执行漏洞(命名编号为S2-048)。国家信息安全漏洞共享平台(CNVD)已将该漏洞收录为高危漏洞(编号:CNVD-2017-13259),攻击者可以利用该漏洞获取服务器主机系统权限。目前,漏洞利用代码已在互联网上公开。从8日凌晨起,互联网上已经出现了大量的攻击尝试且存在若干实现漏洞利用的案例报告。具体情况如下:

一、S2-048漏洞情况分析

Struts2是第二代基于Model-View-Controller (MVC)模型的Java企业级web应用框架,是较为流行的容器软件中间件。2017年7月7日,Apache Struts 发布最新的安全公告S2-048,漏洞成因是Showcase 应用演示Struts2 整合Struts 1 的插件中存在一处任意代码执行缺陷,当应用使用了Struts2 Struts1 的插件时,用户可以构造特定输入(一般为Header字段的OGNL表达式)发送到ActionMessage 类中可导致命令执行,进而获得服务器主机系统权限。

二、漏洞影响范围

S2-048漏洞主要影响使用Struts 1插件的Struts 2.3.x版本,并存在一定的漏洞利用前提限定。在漏洞公开后,国内安全厂商在用户侧也开展了积极的应急防护。CNCERT抽样监测发现S2-48漏洞未产生严重安全问题。

根据CNCERT抽样测试结果(>1000个网站案例,以在S2-045漏洞中受到影响的案例为主),受S2-048漏洞影响的Apache Struts2网站比例约为0.6%,暂未发现党政机关和重要信息系统用户单位案例。

三、漏洞修复建议

官方已在Struts 2.5.10.1版本中修复了该漏洞,请参考官网及时升级:http://struts.apache.org/download.cgi#struts25101。同时,未能及时升级的系统可以参照官方给出的临时解决方案,或启用已生成有针对性防护策略的国内厂商网络侧防护产品(如:防火墙、云WAF等)。

临时解决方案:应使用资源键(resource keys),而不是将原始消息直接传递给ActionMessage类。正确和错误的方式如下所示:

(正确的方式)messages.add("msg",new ActionMessage("struts1.gangsterAdded", gform.getName()));

(错误的方式)messages.add("msg", new ActionMessage("Gangster " + gform.getName() + " was added"));