天天看點

【安全】Apache Tomcat CVE-2017-12617 put請求漏洞修複方案

一·背景描述 近期,Apache項目官網釋出Tomcat中間件遠端代碼執行(CVE-2017-12617)漏洞,可導緻伺服器上的資料洩露或伺服器權限被擷取;外部專業安全機構分析報告顯示該漏洞威脅等級較高,現将有關事項通知如下: 一、漏洞情況說明

說明
漏洞編号 CVE-2017-12617(遠端代碼執行漏洞)
漏洞描述 在一定條件下,攻擊者可以利用這個漏洞,擷取使用者伺服器上JSP檔案的源代碼,或是通過精心構造的攻擊請求,向使用者伺服器上傳惡意JSP檔案,通過上傳的JSP 檔案,可在使用者伺服器上執行任意代碼,進而導緻資料洩露或擷取伺服器權限,存在高安全風險。
威脅等級
影響範圍

Apache Tomcat 9.0.0.M1-9.0.0

Apache Tomcat 8.5.0-8.5.22

Apache Tomcat 8.0.0.RC1-8.0.46

Apache Tomcat 7.0.0-7.0.81

修複方案 參見應急處置要求

二、應急處置要求 (一)CVE-2017-12617修複方案 受CVE-2017-12617影響的Apache Tomcat 7.0.0 - 7.0.81版本建議更新到Apache Tomcat 7.0.82;8.5.0-8.5.22版本建議更新到8.5.23;8.0.0.RC1-8.0.46建議更新到8.0.47;Apache Tomcat 9.0.0.M1-9.0.0建議更新到9.0.1,并進行相關技術和業務測試。 針對受影響版本,Apache官方釋出了對應的Tomcat更新版本。根據安全服務商分析,版本更新可解決上述漏洞。更新版本已上傳至FTP伺服器,位址ftp://10.32.108.37/資訊技術中心标準化文檔/軟體安全更新檔/Tomcat,相關資訊見下表:

版本 檔案名 MD5校驗值
7.0.82 apache-tomcat-7.0.82.tar.gz b9c07fb4f37063e9e8185972b3f88a98
apache-tomcat-7.0.82-windows-x86.zip dceb8435f0f741e1ac85620fee26b98c
apache-tomcat-7.0.82-windows-x64.zip 59a62692f4152d089a9d28daa82154d0
8.5.23 apache-tomcat-8.5.23.tar.gz c4addea2c8c166530f11bdeb4730c26e
apache-tomcat-8.5.23-windows-x86.zip d5433dae3cf986cabe1350b450939458
apache-tomcat-8.5.23-windows-x64.zip 65a15a86d19e1046c98b1ca95100779b
8.0.47 apache-tomcat-8.0.47.tar.gz 0fd249576c33fa71947bc7d296d5b0a9
apache-tomcat-8.0.47-windows-x86.zip 5e4c28f0e2b5602d6531958cb6ff1f6f
apache-tomcat-8.0.47-windows-x64.zip 28cad2840850971c29757f901dee7b8f
9.0.1 apache-tomcat-9.0.1.tar.gz 29c36bbdd7c22a74603d3db04e946be0
apache-tomcat-9.0.1-windows-x86.zip 2ac0885c3588e3d237a0e1590aa0fd56
apache-tomcat-9.0.1-windows-x64.zip 845a0bc44691b15f65ddee5f76de3fd5

官網下載下傳位址: https://tomcat.apache.org/download-70.cgi https://tomcat.apache.org/download-80.cgi https://tomcat.apache.org/download-90.cgi (二)CVE-2017-12617臨時規避方案 使用者可以禁用PUT 二·解決方案 步驟: 1·tomcat目錄 conf  web.xml 和 項目 web-inf 下的Web.xml 添加 以下配置禁用這些請求方式

<security-constraint>  
       <web-resource-collection>  
           <url-pattern>/*</url-pattern>  
           <http-method>PUT</http-method>  
           <http-method>DELETE</http-method>  
           <http-method>HEAD</http-method>  
           <http-method>OPTIONS</http-method>  
           <http-method>TRACE</http-method>  
       </web-resource-collection>  
       <auth-constraint></auth-constraint>  
   </security-constraint>  
           

此方法,适用于靜态資源和實作了doGet、doPost方法的servelt類的服務。一般現代web應用大多采用Spring MVC架構,DispatchServelet的父類重org.springframework.web.servlet.FrameworkServlet重寫了javax.servlet.http.HttpServlet的doGet、doPost、doPut、doDelete、doOptions、doTrace,對應HTTP 的标準方法。

DispatchServelet處理每一個請求時,由javax.servlet.http.HttpServlet的service方法進行處理,是以,HTTP的标準方法都會被處理。單純的配置web.xml無法禁用掉HTTP方法。 2·Spring MVC 禁用HTTP OPTIONS方法 在應用的web.xml中修改spring mvc的配置:

<servlet>  
        <servlet-name>springServlet</servlet-name>  
        <servlet-class>s2jh.biz.util.CustomerDispatcherServlet</servlet-class>  
        <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>/WEB-INF/spring-mvc.xml</param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
        <async-supported>true</async-supported>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>springServlet</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  
           

重寫DispatcherServlet的doOptions方法:

/** 
 * 自定義 Spring MVC DispatcherServlet  
 * Disabled HTTP OPTIONS METHOD 
 */  
public class CustomerDispatcherServlet extends DispatcherServlet {  
  
    private static final Logger LOGGER = LoggerFactory.getLogger(CustomerDispatcherServlet.class);  
      
      
    private static final long serialVersionUID = 8018418118826214565L;  
  
    private static final ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");  
      
    private static final String METHOD_OPTIONS = "OPTIONS";  
      
    @Override  
    protected void doOptions(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        methodNotAllowed(METHOD_OPTIONS, response);  
        LOGGER.warn("HTTP OPTIONS DISABLED.");  
    }  
      
    /** 
     * DISABLED HTTP METHOD 
     *  
     * @param methodName 
     * @param response 
     * @throws IOException 
     */  
    private void methodNotAllowed(String methodName, HttpServletResponse response) throws IOException {   
         String errMsg = lStrings.getString("http.method_post_not_supported");  
         Object[] errArgs = new Object[1];  
         errArgs[0] = methodName;  
         errMsg = MessageFormat.format(errMsg, errArgs);  
           
         response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, errMsg);  
    }  
      
}  
           

在Tomcat的web.xml檔案中配置org.apache.catalina.servlets.DefaultServlet的初始化參數:

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
		<init-param>
			<param-name>readonly</param-name>
			<param-value>true</param-value>
		</init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
           

確定readonly參數為true(預設值),即不允許DELETE和PUT操作。 注意:如果你之前添加了readonly的配置 值為 false ,可能你的項目裡 使用了 rest ,如果 改成true rest 請求會失敗,需要你把用到的 rest 請求修改為 get/post 最後效果如圖:因為在web-resource-collection 裡 禁用了一些請求是以傳回錯誤碼403 HTTP Status 403 - Access to the requested resource has been denied

【安全】Apache Tomcat CVE-2017-12617 put請求漏洞修複方案

如果不禁用請求 單單隻是讓readonly 為 true 生效 效果如下圖 HTTP Status 405 - HTTP method PUT is not supported by this URL

【安全】Apache Tomcat CVE-2017-12617 put請求漏洞修複方案

在網上找的,比較詳細  WebDAV (Web-based Distributed Authoring and Versioning) 一種基于 HTTP 1.1協定的通信協定.它擴充了HTTP 1.1,在GET、POST、HEAD等幾個HTTP标準方法以外添加了一些新的方法,使應用程式可直接對Web Server直接讀寫,并支援寫檔案鎖定(Locking)及解鎖(Unlock),還可以支援檔案的 版本控制。       HTTP/1.1協定中共定義了八種方法(有時也叫“動作”)來表明Request-URI指定的資源的不同操作方式:   OPTIONS 傳回伺服器針對特定資源所支援的HTTP請求方法。也可以利用向Web伺服器發送'*'的請求來測試伺服器的功能性。    HEAD 向伺服器索要與GET請求相一緻的響應,隻不過響應體将不會被傳回。這一方法可以在不必傳輸整個響應内容的情況下,就可以擷取包含在響應消息頭中的元資訊。    GET 向特定的資源送出請求。注意:GET方法不應當被用于産生“副作用”的操作中,例如在web app.中。其中一個原因是GET可能會被網絡蜘蛛等随意通路。    POST 向指定資源送出資料進行處理請求(例如送出表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導緻新的資源的建立和/或已有資源的修改。    PUT 向指定資源位置上傳其最新内容。    DELETE 請求伺服器删除Request-URI所辨別的資源。    TRACE 回顯伺服器收到的請求,主要用于測試或診斷。    CONNECT HTTP/1.1協定中預留給能夠将連接配接改為管道方式的代理伺服器。    方法名稱是區分大小寫的。當某個請求所針對的資源不支援對應的請求方法的時候,伺服器應當傳回狀态碼405(Method Not Allowed);當伺服器不認識或者不支援對應的請求方法的時候,應當傳回狀态碼501(Not Implemented)。    HTTP伺服器至少應該實作GET和HEAD方法,其他方法都是可選的。當然,所有的方法支援的實作都應當符合下述的方法各自的語義定義。此外,除了上述方法,特定的HTTP伺服器還能夠擴充自定義的方法。      http的通路中,一般常用的兩個方法是:GET和POST。其實主要是針對DELETE等方法的禁用。

[部分資料節選自網絡]

繼續閱讀