Text4Shell (CVE-2022-42889) 分析

前言

Apache Commons Text是Apache软件基金会的一个开源项目,旨在提供一套用于处理文本的工具和实用程序。它提供了各种文本操作功能,如字符串操作、格式化、转换、解析和验证等。该项目的目标是简化文本处理任务,使开发人员能够更轻松地操作和处理文本数据。

漏洞影响版本

Apache Commons Text漏洞版本1.5 <= version<= 1.9

漏洞分析

漏洞入口点在StringSubstitutor.replace(),打个断点跟进

public String replace(final String source) {
        if (source == null) {
            return null;
        }
        final TextStringBuilder buf = new TextStringBuilder(source);
        if (!substitute(buf, 0, source.length())) {
            return source;
        }
        return buf.toString();
    }

这里调用了substitute()函数来解析传入的字符串。函数将遍历字符串的每个字符,并确定起始位置${和结束位置}。然后提取${}里的字符串script:js:java.lang.Runtime.getRuntime().exec('open -a calculator'),如果这里面包含变量,那么就会把变量的值替换出来,以确保这里面没有包含变量。

最后传入resolveVariable()

1685354557974.png

然后调用InterpolatorStringLookup.lookup

1685354698959.png
1685354988124.png
1685355133073.png

:作为分隔符,前缀为script,变量名为js:java.lang.Runtime.getRuntime().exec('open -a calculator')

1685355299878.png

接下来根据前缀寻找对应的StringLookup对象,得到ScriptStringLookup对象并调用lookup()

这里的通过:将字符串分割为两部分,前者引入js引擎,后者作为被执行的代码,最后被ScriptEngine#eval 执行

1685355591257.png

总结就是:默认使用的Lookup实例集包括可能导致任意代码执行或与远程服务器信息交换的插值器Interpolator。本次漏洞就是由interpolator.replace -> ScriptStringLookup -> ScriptEngine.eval()

漏洞复现

1685356779064.png