7月7日,Apache Struts官方发布了漏洞编号为:S2-048的高危漏洞公告。
阿里云安全团队2小时内发布官方安全建议,跟踪S2-048的全球攻击趋势,并对不同漏洞版本进行了对比分析。
目前,阿里云云盾态势感知已支持检测,WAF默认支持防御。
一、影响范围
如果在ApacheStruts 2.3.x系列中启用了struts2-struts1-plugin插件,会受到该漏洞的影响。
二、攻击源分析
阿里云安全团队对S2-048在全球范围内的攻击源进行分析。
其中,有3/4的攻击源来自国内的北京、上海地区,1/4来自海外(美国、韩国)和香港地区。
三、原理及利用方法分析
在SaveGangsterAction.java的文件里看的有execute方法的实现,其中gforn.getName()是攻击者可控的,gforn.getName()的值可以带入messages结构中;
在Struts1Action.java里可以看到,其实是调用SaveGangsterAction.execute方法,然后再调用getText(msg.getKey())
getText方法会把actionmessages传递给com.opensymphony.xwork2.util.LocalizedTextUtil.getDefaultMessage ,
其中又调用了com.opensymphony.xwork2.util.TextParseUtil.translateVariables,它用来调用OGNL 表达式用处理字符串表达式;
使用EL表达式简单测试$(1>2);
漏洞测试生效。
四、漏洞对比分析
阿里云安全团队将S2-045及S2-048漏洞的利用原理做了对比分析。
对比S2-045和S2-048的漏洞攻击次数发现,S2-045的危害程度和关注度比S2-048高;在S2-048漏洞爆发后,由于未公开POC和利用工具,当天被利用攻击的几率比较小,安全风险相对较低。
五、安全建议
- 及时检测是否受到漏洞影响:使用的Struts是 2.3.x版本,是否启用了struts2-struts1-plugin插件。使用阿里云云盾态势感知进行漏洞检测。
- 阿里云上用户可以禁用、关闭(删除)struts-2.3.xappsstruts2-showcase.war包; 建议关闭devmod模式(请根据自身业务情况决定是否关闭)。
- 开发者可以使用resourcekeys替代,将原始消息直接传递给ActionMessage的方式,以此作为根治措施。
正确方式:
messages.add("msg",new ActionMessage("struts1.gangsterAdded", gform.getName()))
错误方式:
messages.add("msg",new ActionMessage("Gangster " + gform.getName() + " wasadded"))
- 建议将Struts2升级到最新版本2.5.10.1。
- 使用阿里云云盾WAF对该漏洞进行防御。