威脅描述
計(jì)算未驗(yàn)證的 SpEL 表達(dá)式可能導(dǎo)致執(zhí)行遠(yuǎn)程代碼。
威脅說(shuō)明
Spring 表達(dá)式語(yǔ)言(簡(jiǎn)寫為 SpEL)是一種功能強(qiáng)大的表達(dá)式語(yǔ)言,支持在運(yùn)行時(shí)查詢和處理對(duì)象圖。該語(yǔ)言的語(yǔ)法與統(tǒng)一 EL 類似,但提供了更多功能,尤其是方法調(diào)用和基本字符串模板化功能。允許計(jì)算未驗(yàn)證的表達(dá)式將允許攻擊者執(zhí)行任意代碼。
示例 1:應(yīng)用程序使用受用戶控制的未驗(yàn)證數(shù)據(jù)創(chuàng)建和計(jì)算 SpEL 表達(dá)式
String expression = request.getParameter("message");
SpelExpressionParser parser = new SpelExpressionParser();
SpelExpression expr = parser.parseRaw(expression);
示例 2:應(yīng)用程序在執(zhí)行雙重 SpEL 計(jì)算的 Spring 標(biāo)記中使用受用戶控制的未驗(yàn)證數(shù)據(jù)
<spring:message text="" code="${param['message']}"></spring:message>
示例1和示例2攻擊Payload:
# 彈出計(jì)算器
http://localhost:8080/test?message=${new%20java.lang.ProcessBuilder(new%20java.lang.String(new%20byte[]{99,97,108,99})).start()} # calc
參考
修復(fù)建議
1. 限制SpEL功能
SpEL 提供的兩個(gè) EvaluationContext
,區(qū)別如下:
-
SimpleEvaluationContext
- 針對(duì)不需要 SpEL 語(yǔ)言語(yǔ)法的全部范圍并且應(yīng)該受到有意限制的表達(dá)式類別,公開 SpEL 語(yǔ)言特性和配置選項(xiàng)的子集。 -
StandardEvaluationContext
- 公開全套 SpEL 語(yǔ)言功能和配置選項(xiàng)。您可以使用它來(lái)指定默認(rèn)的根對(duì)象并配置每個(gè)可用的評(píng)估相關(guān)策略。
SimpleEvaluationContext
旨在僅支持 SpEL 語(yǔ)言語(yǔ)法的一個(gè)子集。它不包括 Java類型引用
、構(gòu)造函數(shù)
和 bean引用
。所以說(shuō)指定正確 EvaluationContext
,是防止SpEl表達(dá)式注入漏洞產(chǎn)生的首選。方法如下:
String expression = request.getParameter("message");
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(expression);
StandardEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().withRootObject().build();
String message = exp.getValue(context, String.class);
exp.setValue(context, "Hello");
2. Spring Boot
影響版本:
-
1.1.0
-1.1.12
-
1.2.0
-1.2.7
1.3.0
修復(fù)方案:升級(jí)至 1.3.1
或以上版本
參考:
3. Spring Data Commons
影響版本:
- Spring Data Commons 1.13 - 1.13.10 (Ingalls SR10)
- Spring Data REST 2.6 - 2.6.10 (Ingalls SR10)
- Spring Data Commons 2.0 to 2.0.5 (Kay SR5)
- Spring Data REST 3.0 - 3.0.5 (Kay SR5)
- 更早的版本也會(huì)受到影響
修復(fù)方法:
升級(jí)代碼框架
- Spring Data Commons
- 2.0.x的用戶升級(jí)到2.0.6及以上
- 1.13.x的用戶升級(jí)到1.13.11及以上
- Spring Data REST
- 2.x用戶升級(jí)到2.6.11及以上
- 3.x用戶升級(jí)到3.0.6及以上
- Spring Boot
- 1.5.x用戶升級(jí)到1.5.11及以上
- 2.x用戶升級(jí)到2.0.1及以上