最新Struts漏洞修复方案

来源:互联网 发布:itunes更新软件 编辑:程序博客网 时间:2024/04/29 03:14

         2014年3月2日,Apache Struts发表了S2-020报告,同时发布Struts 2.3.16.1版本 ,用于修复class参数引起的安全漏洞(CVE-2014-0094)。

这次安全漏洞影响范围很大,波及了Struts全版本,即Struts 1.x 和Struts 2.x。

         产生此安全漏洞的原因是,Apache Struts的默认上传机制是基于Commons FileUpload 1.3版本,其附加的ParametersInterceptor允许访问'class' 参数(该参数直接映射到getClass()方法),并允许控制ClassLoader。在具体的Web容器部署环境下(如:Tomcat),攻击者利用 Web容器下的Java Class对象及其属性参数(如:日志存储参数),可向服务器发起远程代码执行攻击,进而植入网站后门控制网站服务器主机。

          2014年04月22日,有安全机构发现修复版本Struts2.3.16.1并没有把此安全漏洞解决,对上传参数的过滤并不完全。于是官方两天后就发布了Struts 2.3.16.2版本。

          但是,由于class调用方式众多,目前并没有最终解决此安全漏洞。

          目前为止,可行的修复方案有两个。

         1. 添加需要过滤文字列(适用于Struts 2.x版本)

          修改struts2源码,struts-default.xml文件<interceptor-refname="params">标签里面的<paramname="excludeParams">,

          文字列^dojo\..*

          全部替换为

     (.*\.|^|.*|\[('|"))(c|C)lass(\.|('|")]|\[).* ,^dojo\..*

          2.JAVA中添加过滤器,拒绝特定参数的请求(适用于Struts 1.x和Struts 2.x版本)

          web.xml中添加<filter>标签,Filter类中使用正则(^|\\W)[cC]lass\\W与请求的参数一一匹配,符合条件的话,抛出系统异常,终止服务。

配置Filter规则:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  <filter>    <filter-name>ClassPollutionFilter</filter-name>    <filter-class>cn.harveylee.struts.ClassPollutionFilter</filter-class>  </filter>  <filter-mapping>    <filter-name>ClassPollutionFilter</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping></web-app>

添加Filter代码:

package cn.leee.struts;import java.io.IOException;import java.util.Enumeration;import java.util.regex.Pattern;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;public class ClassPollutionFilter implements Filter {    private static Pattern EXCLUDE_PARAMS = Pattern.compile("(^|\\W)[cC]lass\\W");    public void destroy() {        }    @Override    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        HttpServletRequest req = (HttpServletRequest)request;        Enumeration<?> params = req.getParameterNames();        while (params.hasMoreElements()) {            String paramName = (String) params.nextElement();            if (isClassPollution(paramName)) {                throw new IllegalArgumentException("Exclude param: " + paramName);            }        }        Cookie cookies[] = req.getCookies();        if (cookies != null) {            for  (Cookie c : cookies) {                String cookieName = c.getName();                if (isClassPollution(cookieName)) {                    throw new IllegalArgumentException("Exclude param: " + cookieName);                }            }        }        chain.doFilter(request, response);    }    private static boolean isClassPollution(String target) {        return EXCLUDE_PARAMS.matcher(target).find();    }    @Override    public void init(FilterConfig config) throws ServletException {        }}


附参考文档网址

S2-020报告:http://struts.apache.org/release/2.3.x/docs/s2-020.html

S2-021报告:http://struts.apache.org/release/2.3.x/docs/s2-021.html

Struts 2.3.16.2下载地址:http://struts.apache.org/download.cgi#struts23162

日本安全事件反应协会报告:http://www.nca.gr.jp/2014/struts_s20/index.html
0 0
原创粉丝点击