Struts2 S2-048
远程代码执行漏洞分析报告
安全通告
尊敬的客户:
2017年7月7日,Struts2官方公布最新的Struts2远程代码执行漏洞S2-048,在一定条件下,该漏洞允许攻击者远程执行代码。安恒信息应急响应中心启动“黄色”预警预案。
目前,安恒信息的WAF、玄武盾都已升级检测规则,可以有效防护该漏洞。网站安全监测平台、Web应用弱点扫描器、远程安全评估系统和等级保护安全检查工具箱也已升级,可以检测该漏洞,建议上述产品用户尽快将规则库升级到最新版本。
安恒信息已经开发出漏洞检查工具,下载链接:
http://pan.baidu.com/s/1jIdx62U
安恒信息应急响应中心将对该漏洞进行持续关注,并第一时间为您更新相关漏洞信息。
安恒信息应急响应中心
2017年7月7日
漏洞信息
1. 漏洞描述
Struts2 是 Apache 软件基金会负责维护的一个基于MVC设计模式的 Web 应用框架开源项目。
当开发人员在Struts2开发框架中使用插件 “Struts1”,且该插件允许应用使用Struts 1的Actions 和 ActionForms ,此时如果将请求参数值作为构建 ActionMessage 对象的内容,直接返回给用户,则可能产生远程代码执行漏洞。
2. 漏洞危害
高
3. 影响版本
Strut2.3.x
4. 漏洞利用前置条件
必须使用Struts-core-1.x.x.jar插件,且ActionMessage类的key属性可控。
5. 风险等级
安恒信息应急响应中心将此漏洞安全风险定级为: 高危
6. 漏洞分析
Struts2.3.x中showcase.war中存在一个名为“SaveGangsterAction.java”类,这个类实现了Struts2中的Struts1.x-core.jar插件中的Action,如下图:
直接将HTTP POST中的name参数值作为key传给ActionMessage类,其中ActionMessage中的key就可以被控制。
接下来会调用org.apache.struts2.s1.Struts1Action的public String execute() throws Exception,方法如下图:
调用com.opensymphony.xwork2.ActionSupport的getText(String aTextName)的方法来获取对象的错误消息。
再调用com.opensymphony.xwork2.util.LocalizedTextUtil中以下方法private static GetDefaultMessageReturnArg getDefaultMessage(String key, Locale locale, ValueStack valueStack, Object[] args, String defaultMessage)方法来调用ognl获取对应的错误消息。
具体的函数调用栈如下:
7. 漏洞自查
用户可通过以下方法进行漏洞自查:
在请求参数中加入如下代码
${#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('test','test')}
如在Response Header中出现test:test字段,则表示存在漏洞。
修复建议
1. 官方补丁
目前 Apache 官方暂未发布官方补丁。
2. 临时缓解措施
方法一
停用 showcase.war
方法二
开发者通过使用 resource keys 替代将原始消息直接传递给 ActionMessage 的方式。 如下所示:
messages.add("msg", new ActionMessage("struts1.gangsterAdded", gform.getName()));
请不要使用如下的方式
messages.add("msg", new ActionMessage("Gangster " gform.getName() " was added"));
方法三
安恒信息玄武盾产品可对该漏洞防护,如有需求可与我们联系并快速接入。
- END -