CVE-2018-1270:spring-messaging遠程代碼執行漏洞分析預警
報告編號: B6-2018-040901
報告來源: 360-CERT報告作者: 360-CERT更新日期: 2018-04-09
漏洞概述
2018年4月5日,Pivotal Spring官方發布安全公告,Spring框架中存在三個漏洞,其中編號為CVE-2018-1270的漏洞可導致遠程代碼執行。
360-CERT通過對此漏洞進行了相關分析,認為漏洞影響嚴重;目前相關PoC已經被發布,建議相關用戶儘快進行評估升級。
漏洞影響面
影響版本
Spring Framework 5.0 to 5.0.4.
Spring Framework 4.3 to 4.3.14
已不支持的舊版本仍然受影響
修復版本5.0.x 用戶升級到5.0.5版本
4.3.x 用戶升級到4.3.15版本
漏洞詳情
CVE-2018-1270
Spring框架中通過spring-messaging模塊來實現STOMP(Simple Text-Orientated Messaging Protocol),STOMP是一種封裝WebSocket的簡單消息協議。攻擊者可以通過建立WebSocket連接並發送一條消息造成遠程代碼執行。如果使用了Spring Security項目中的許可權認證,可以在一定程度上增加漏洞利用難度。
CVE-2018-1271
當Spring MVC的靜態資源存放在Windows系統上時,攻擊可以通過構造特殊URL導致目錄遍歷漏洞。
此漏洞觸發條件較高:
- Server運行於Windows系統上
- 從文件系統提供的文件服務(比如使用file協議,但不是file open)
- 沒有使用CVE-2018-1199漏洞的補丁
- 不使用Tomcat或者是WildFly做Server
CVE-2018-1272
在Spring MVC或者WebFlux應用把客戶端請求再轉向另一台伺服器的場景下,攻擊者通過構造和污染Multipart類型請求,可能對另一台伺服器實現許可權提升攻擊。
CVE-2018-1270漏洞分析
SpEL
Spring表達式語言全稱Spring Expression Language,支持查詢和操作運行時對象導航圖功能.。語法類似於傳統EL,而且供額外的功能,能夠進行函數調用和簡單字元串的模板函數。
SpEL用法
String expression = "T(java.lang.Runtime).getRuntime().exec(/"calc/")";String result = parser.parseExpression(expression).getValue().toString();
漏洞觸發流程
搭建spring-message 項目demo
其中靜態資源app.js運行在客戶端與伺服器做websocket交互,使用connect()函數建立Stomp鏈接
function connect() { var socket = new SockJS(/gs-guide-websocket); stompClient = Stomp.over(socket); stompClient.connect({}, function (frame) { setConnected(true); console.log(Connected: + frame); stompClient.subscribe(/topic/greetings, function (greeting) { showGreeting(JSON.parse(greeting.body).content); }); }); }
Step1
增加一個header頭部,添加selector項,value為payload,Stomp協議規範中通過指定selector對訂閱的信息進行過濾
Web應用在handleMessageInternal對消息進行處理,註冊訂閱者registerSubscription,最後調用DefaultSubscriptionRegistry函數對header參數進行處理,對selector值進行了解析,並將其保存至這次會話中。
Step2
點擊send向伺服器發送任意消息。Spring 在向訂閱者分發消息時會調用filterSubscription對消息進行過濾,會執行expression.getValue(context, Boolean.class)
造成任意命令執行
補丁分析
補丁地址
-import org.springframework.expression.spel.support.StandardEvaluationContext;+import org.springframework.expression.spel.support.SimpleEvaluationContext;
刪除了StandardEvaluationContext
引用,採用了SimpleEvaluationContext
,StandardEvaluationContext
可以執行任意SpEL表達式,Spring官方在5.0.5之後換用SimpleEvaluationContext
,用於實現簡單的數據綁定,保持靈活性減少安全隱患
SimpleEvaluationContext地址
StandardEvaluationContext地址
時間線
2018-04-05 Spring官方發布公告
2018-04-09 360-CERT發布分析預警通告
參考鏈接
- https://xz.aliyun.com/t/2252
- https://pivotal.io/security/cve-2018-1270
- https://pivotal.io/security
推薦閱讀:
※spring下動態註冊組件的一種簡單的解決思路
※Spring Cloud構建微服務架構:服務註冊與發現(Eureka、Consul)【Dalston版】
※為Spring Cloud Ribbon配置請求重試(Camden.SR2+)
※Spring(1):概念及ioc操作
※史上最簡單的SpringCloud教程 | 第八篇: 消息匯流排(Spring Cloud Bus)
TAG:Spring |