Spring Security 安全建議

CVE-2016-9879 路徑變數中編碼的 "/"

| 2016年12月28日 | CVE-2016-9879

描述

Spring Security 在處理安全性限制時,不會考慮 URL 路徑參數。藉由在請求中新增帶有編碼 "/" 的 URL 路徑參數,攻擊者可能可以繞過安全性限制。此問題的根本原因是 Servlet 規格中對於路徑參數處理方式的不明確 (請參閱下方)。某些 Servlet 容器會在 getPathInfo() 傳回的值中包含路徑參數,而有些則不包含。Spring Security 使用 getPathInfo() 傳回的值,作為將請求對應到安全性限制的過程的一部分。路徑參數的意外存在可能會導致繞過限制。

Apache Tomcat (所有目前版本) 的使用者不受此漏洞影響,因為 Tomcat 遵循 Servlet 專家群組先前提供的指導,並從 getContextPath()、getServletPath() 和 getPathInfo() 傳回的值中刪除路徑參數 [1]。

基於 Apache Tomcat 的其他 Servlet 容器的使用者可能會或可能不會受到影響,具體取決於路徑參數的處理方式是否已修改。

已知 IBM WebSphere Application Server 8.5.x 的使用者受到影響。

其他實作 Servlet 規格的容器的使用者可能會受到影響。

[1] https://issues.apache.org/bugzilla/show_bug.cgi?id=25015

受影響的 Spring 產品和版本

  • Spring Security 3.2.0 - 3.2.9
  • Spring Security 4.0.x - 4.1.3
  • Spring Security 4.2.0
  • 較舊的不支援版本也受到影響

緩解措施

採用下列緩解措施之一將可以防止此漏洞。

  • 使用已知不會在 getServletPath() 和 getPathInfo() 的傳回值中包含路徑參數的 Servlet 容器
  • 升級到 Spring Security 3.2.10、4.1.4 或 4.2.1 將會在偵測到編碼 "/" 時,以 RequestRejectedException 拒絕請求。注意:如果您希望停用此功能,可以透過設定 DefaultHttpFirewall.allowUrlEncodedSlash = true 來停用它。但是,停用此功能表示應用程式容易受到攻擊 (在 getServletPath() 或 getPathInfo() 中傳回路徑參數的容器中)。

致謝

此問題由 NTT DATA Corporation 的 Shumpei Asahara 和 Yuji Ito 發現,並以負責任的態度回報給 Pivotal。

參考資料

歷史記錄

2016-12-28:發布初始漏洞報告

領先一步

VMware 提供訓練和認證,以加速您的進度。

瞭解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

瞭解更多

即將舉辦的活動

查看 Spring 社群中所有即將舉辦的活動。

檢視全部