CVE-2017-4995: Jackson 配置允許透過未知的“反序列化小工具”執行程式碼

| 2017 年 6 月 8 日 | CVE-2017-4995

描述

當配置為啟用預設型別(default typing)時,Jackson 存在一個反序列化漏洞,可能導致任意程式碼執行。Jackson 透過將已知的“反序列化小工具”(deserialization gadgets)列入黑名單來修復此漏洞。

Spring Security 將 Jackson 配置為啟用全域性預設型別(global default typing),這意味著透過之前的漏洞,如果滿足以下所有條件,則可以執行任意程式碼

  • 透過呼叫 SecurityJackson2Modules.getModules(ClassLoader) 或 SecurityJackson2Modules.enableDefaultTyping(ObjectMapper) 來利用 Spring Security 的 Jackson 支援
  • 使用 Jackson 反序列化不受信任的資料。Spring Security 不使用 Jackson 執行反序列化,因此這是使用者的明確選擇。
  • 在類路徑中存在一個未知的(Jackson 尚未將其列入黑名單)允許執行程式碼的“反序列化小工具”(deserialization gadget)

Jackson 提供了黑名單方法來防範此類攻擊,但當 Spring Security 啟用預設型別(default typing)時,Spring Security 應該主動阻止未知的“反序列化小工具”(deserialization gadgets)。

受影響的 Spring 產品和版本

  • Spring Security 4.2.0.RELEASE - 4.2.2.RELEASE
  • Spring Security 5.0.0.M1

緩解措施

受影響版本的使用者應採取以下緩解措施

  • 已修復此問題的版本包括:<ul><li>Spring Security: 4.2.3.RELEASE+</li><li>Spring Security: 5.0.0.M2+</li></ul>
  • 此修復確保預設情況下只反序列化明確對映的類。使用明確對映的類的效果是建立了一個白名單,這與所有受支援的 Jackson 版本相容。如果使用者明確選擇啟用全域性預設型別(global default typing),則會恢復之前潛在危險的配置。

參考資料

CVE-2017-4971: Spring Web Flow 中的資料繫結表示式漏洞

| 2017 年 5 月 31 日 | CVE-2017-4971

描述

未更改 MvcViewFactoryCreator 的 useSpringBinding 屬性值(該屬性預設停用,即設定為“false”)的應用程式,在其檢視狀態中處理表單提交但沒有子元素來宣告顯式資料繫結屬性對映時,可能容易受到惡意 EL 表示式的影響。

受影響的 Spring 產品和版本

  • Spring Web Flow 2.4.0 至 2.4.4
  • 較舊的不受支援的版本也受到影響

緩解措施

受影響版本的使用者應採取以下緩解措施

  • 2.4.x 使用者應升級到 2.4.5
  • 請注意,通常建議在檢視狀態中始終使用顯式資料繫結宣告,這是一個很好的實踐,以防止表單提交設定目標物件上不應設定的欄位。
  • 使用 JSF 的 Spring Web Flow 使用者不受此報告影響。

致謝

該問題由 Gotham Digital Science 的 Stefano Ciccone 發現

參考資料

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

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

描述

Spring Security 在處理安全約束時未考慮 URL 路徑引數。攻擊者可以透過在請求中新增帶有編碼 '/' 的 URL 路徑引數來繞過安全約束。此問題的根本原因是 Servlet Specification(參見下文)中關於路徑引數處理的說明不夠清晰。一些 Servlet 容器在 getPathInfo() 返回的值中包含路徑引數,而另一些則不包含。Spring Security 使用 getPathInfo() 返回的值作為將請求對映到安全約束的過程的一部分。路徑引數的意外存在可能導致約束被繞過。

Apache Tomcat(所有當前版本)的使用者不受此漏洞影響,因為 Tomcat 遵循 Servlet Expert group 先前提供的指導,並從 getContextPath()、getServletPath() 和 getPathInfo() 返回的值中去除路徑引數 [1]。

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

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

實現 Servlet specification 的其他容器的使用者可能受到影響。

[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。

參考資料

CVE-2016-9878 Spring Framework ResourceServlet 中的目錄遍歷漏洞

| 2016 年 12 月 21 日 | CVE-2016-9878

描述

提供給 ResourceServlet 的路徑未被正確清理,因此存在目錄遍歷攻擊的風險。

受影響的 Spring 產品和版本

  • Spring Framework 4.3.0 至 4.3.4
  • Spring Framework 4.2.0 至 4.2.8
  • Spring Framework 3.2.0 至 3.2.17
  • 較舊的不受支援的版本也受到影響

緩解措施

受影響版本的使用者應採取以下緩解措施

  • 4.3.x 使用者應升級到 4.3.5
  • 4.2.x 使用者應升級到 4.2.9
  • 3.2.x 使用者應升級到 3.2.18

請注意,很少有應用程式可能使用 ResourceServlet。自版本 3.0(約 2009 年)以來,它通常已被 ResourceHttpRequestHandler 及相關類取代,後者預設使用並提供更高階的功能,請參閱參考文件中的“提供資源(Serving Resources)”。ResourceServlet 現在在 3.2.x 和 4.x 中已被棄用,並從版本 5 開始完全移除。

致謝

該問題由 NTT DATA Corporation 的 Shumpei Asahara 和 Yuji Ito 發現,並負責任地報告給了 Pivotal。

參考資料

CVE-2016-6652 Spring Data JPA 盲注 SQL 注入漏洞

| 2016 年 9 月 30 日 | CVE-2016-6652

描述

Sort 例項傳遞給使用手動宣告的 JPQL 查詢的使用者定義 Spring Data 儲存庫查詢方法時,這些例項會按原樣傳遞給永續性提供程式,並允許攻擊者將任意 JPQL 注入到 ORDER BY 子句中,攻擊者可以利用它根據查詢結果元素順序的變化來推斷未暴露欄位的資訊(取決於注入的 JPQL)。

如果 Sort 例項是從不可信來源(例如 Web 請求引數)建立的,則尤其會發生這種情況。

受影響的 Spring 產品和版本

  • Spring Data JPA 1.10.2, 1.9.4
  • 較舊的不受支援的版本也受到影響

緩解措施

受影響版本的使用者應採取以下緩解措施

  • 建議使用者升級到 Spring Data JPA 的 1.10.4 (Hopper SR4) 或 1.9.6 (Gosling SR6) 版本。這些版本對傳遞給資料訪問層的 <code>Sort</code> 例項進行了清理,並僅允許引用查詢方法背後的 JPQL 中使用的領域物件欄位和別名。
  • 如果使用者仍然需要將複雜的排序表示式傳遞給資料訪問層,他們可以使用新引入的 <code>JpaSort.unsafe(…)</code> 來恢復舊的行為。

致謝

該漏洞由 Silverskin Information Security 的 Niklas Särökaari 以及來自… 的 Joona Immonen、Arto Santala、Antti Virtanen、Michael Holopainen 和 Antti Ahola 負責任地報告。

CVE-2016-4977 Spring Security OAuth 中的遠端程式碼執行 (RCE) 漏洞

| 2016 年 7 月 5 日 | CVE-2016-4977

描述

在使用 whitelabel 檢視處理授權請求時,response_type 引數值被作為 Spring SpEL 執行,這使得惡意使用者可以透過精心構造 response_type 的值來觸發遠端程式碼執行。

受影響的 Spring 產品和版本

  • 2.0.0 至 2.0.9
  • 1.0.0 至 1.0.5

緩解措施

受影響版本的使用者應採取以下緩解措施

  • 1.0.x 的使用者不應使用 whitelabel 檢視作為審批和錯誤頁面
  • 2.0.x 的使用者要麼不使用 whitelabel 檢視作為審批和錯誤頁面,要麼升級到 2.0.10 或更高版本

致謝

此問題由 David Vieira-Kurz (@secalert) 發現,並由 Oliver Schoenherr 代表 Immobilien Scout GmbH 報告。

參考資料

CVE-2016-2173 Spring AMQP 中的遠端程式碼執行漏洞

嚴重 | 2016 年 4 月 11 日 | CVE-2016-2173

描述

org.springframework.core.serializer.DefaultDeserializer 類未根據白名單驗證反序列化物件。透過提供經過精心構造的序列化物件(例如 Chris Frohoff 的 Commons Collection gadget),可以實現遠端程式碼執行。

受影響的 Spring 產品和版本

  • 1.0.0 至 1.5.4

緩解措施

受影響版本的使用者應採取以下緩解措施

  • 引用的類 (DefaultDeserializer) 不會被任何 Spring application context 自動註冊;使用者在使用此類別處理來自不受信任來源的物件時應謹慎,就像直接使用 ObjectInputStream 時一樣。
  • Spring AMQP 有一個(可選的)訊息轉換器,可以使用此反序列化器;從版本 1.5.5 開始,該轉換器現在可以配置一個可接受反序列化的包/類的白名單。
  • Spring AMQP 還有一個預設配置的 SimpleMessageConverter;它不使用反序列化器,但內部使用 ObjectInputStream;它現在也可以配置一個包/類的白名單。
  • 建議使用者在使用 RabbitMQ 且可能接收不受信任資料的環境中不要使用 Java 序列化;如果使用,則應配置轉換器以允許特定的物件。
  • 可能暴露於此漏洞的使用者應升級到 Spring AMQP 1.5.5 或更高版本,並配置白名單。

致謝

Code White 的 Matthias Kaiser 發現了此漏洞 (www.code-white.com)

參考資料

CVE-2015-5258 Spring Social CSRF

| 2015 年 11 月 12 日 | CVE-2015-5258

描述

在針對 OAuth 2 API 提供程式授權應用程式時,Spring Social 容易受到跨站請求偽造 (CSRF) 攻擊。該攻擊涉及惡意使用者使用偽造的 OAuth 2 API 提供程式賬戶開始 OAuth 2 授權流程,但透過誘騙受害者在其瀏覽器中訪問回撥請求來完成此過程。結果是,攻擊者將透過偽造的提供程式賬戶訪問受害者在易受攻擊網站上的賬戶。

受影響的 Spring 產品和版本

  • Spring Social Core 1.0.0 至 1.0.3
  • Spring Social Core 1.1.0 至 1.1.2

緩解措施

受影響的 Spring Social 版本的使用者應按如下方式升級

  • 對於 Spring Social 1.0.x,升級到 1.1.3+
  • 對於 Spring Social 1.1.x,升級到 1.1.3+

在上述版本中,Spring Social 要求回撥請求中存在 `state` 引數。如果未找到,將丟擲 IllegalStateException 並終止授權流程。

致謝

該問題最初由 Include Security 的 Kris Bosch 發現。隨後,sourceclear (https://srcclr.com) 的 Paul Ambrosini 確定了根本原因、受影響的庫和受影響的程式碼。

CVE-2015-5211 Spring Framework 中的 RFD 攻擊

| 2015 年 10 月 15 日 | CVE-2015-5211

描述

在某些情況下,Spring Framework 容易受到反射式檔案下載 (Reflected File Download, RFD) 攻擊。該攻擊涉及惡意使用者精心構造一個帶有批處理指令碼副檔名的 URL,導致響應被下載而非渲染,並且響應中還包含一些反射的輸入。

有關詳細資訊和具體示例,請參閱 Trustwave 的這篇非常有用的RFD 論文

受影響的 Spring 產品和版本

  • Spring Framework 3.2.0 至 3.2.14
  • Spring Framework 4.0.0 至 4.1.7
  • Spring Framework 4.2.0 至 4.2.1
  • 較舊的不受支援的版本也受到影響

緩解措施

受影響的 Spring Framework 版本的使用者應按如下方式升級

  • 對於 3.2.x,升級到 3.2.15+。
  • 對於 4.0.x 和 4.1.x,升級到 4.1.8+。
  • 對於 4.2.x,升級到 4.2.2+。

在上述版本中,Spring MVC 在使用 HttpMessageConverter 寫入之前會檢查 URL 是否包含副檔名,如果副檔名未知,則會新增“Content-Disposition”響應頭,建議下載檔名“f.txt”。預設情況下,“已知”副檔名列表包括與內建 HttpMessageConverter 實現相關的副檔名以及為內容協商目的而明確註冊的任何附加副檔名。對於 4.x,修復還包括對 SockJS URL 進行 URL 檢查以及在所有支援 JSONP 的區域驗證 JSONP 回撥引數。

簡單地升級到上述版本即可保護應用程式免受 RFD 攻擊。還可以採取一些進一步的措施

  • 對 JSON 響應進行編碼而不是轉義。這也是 OWASP XSS 的建議。有關如何使用 Spring 執行此操作的示例,請參閱 https://github.com/rwinch/spring-jackson-owasp
  • 配置字尾模式匹配以將其關閉或僅限於顯式註冊的字尾。
  • 配置內容協商,將屬性“useJaf”和“ignoreUknownPathExtension”設定為 false,對於具有未知副檔名的 URL 將導致 406 響應。但請注意,如果 URL 自然地預期末尾帶有小數點,則此選項可能不適用。
  • 在響應中新增 'X-Content-Type-Options: nosniff' 頭部。Spring Security 4 預設執行此操作。

致謝

Trustwave 在一篇論文中描述了 RFD 攻擊。Spring Framework 中的此問題由 HPE Security Research 的 Alvaro Muñoz 負責任地報告給了 Pivotal。特別感謝…

搶先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲取支援

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

瞭解更多

即將舉行的活動

檢視 Spring 社群中即將舉行的所有活動。

檢視全部