漏洞分析Apache Commons Text远程代码执行漏洞(CVE-2022-42889)
Posted olga5abl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漏洞分析Apache Commons Text远程代码执行漏洞(CVE-2022-42889)相关的知识,希望对你有一定的参考价值。
一、漏洞信息
漏洞描述
CVE编号:CVE-2022-42889
Apache Commons Text:该组件是一款处理字符串和文本块的开源项目,简单来说,除了核心Java提供的功能外,Apache Commons文本库还包含了许多有用的实用程序方法,用于处理字符串。通常在开发过程中用于占位符和动态获取属性的字符串编辑工具包,常用于数据库查询前的语句替换,或者页面输出时的替换。
Apache Commons Text执行变量插值,允许动态评估和扩展属性。插值的标准格式是“${prefix:name}”,其中“prefix”用于查找org.apache.commons.text.loookup的实例,执行插值的StringLookup 。从1.5版开始一直到1.9版,默认Lookup实例集包括插值器,这些插值器可能导致任意代码执行或与远程服务器通信。这些查找是:-“script”-使用JVM脚本执行引擎(javax.script)执行表达式-“dns”-解析dns记录-“url”-从url加载值,如果使用不受信任的配置值,则受影响版本中使用插值默认值的应用程序,可能容易受到远程代码执行或与远程服务器无意接触的影响。建议用户升级到Apache Commons Text 1.10.0,默认情况下会禁用有问题的插值器。
影响范围
1.5 <= Apache Commons Text <= 1.9
修复建议
建议升级组件,获取官方版本地址如下:
https://commons.apache.org/proper/commons-text/download_text.cgi
安博通防护能力
对于该漏洞,安博通已经第一时间跟进,添加相应的IPS防护规则,为用户提供高效及时的安全防护。
IPS版本:20221017.uips及以上版本
规则编号:995174
防护效果
二、漏洞研究
漏洞复现
复现的代码如下:
package com.seanwrightsec.poc;
import org.apache.commons.text.StringSubstitutor;
import java.util.Scanner;
public class PoC
public final static String DEFAULT_POC_STRING = "$script:javascript:195 + 324";
public static void main(String[] args)
StringSubstitutor stringSubstitutor = StringSubstitutor.createInterpolator();
System.out.println("Enter your exploit string (press Enter to use the default of '$script:javascript:195 + 324'): ");
Scanner in = new Scanner(System.in);
String exploitString = in.nextLine();
if (exploitString.equals(""))
exploitString = DEFAULT_POC_STRING;
String output = stringSubstitutor.replace(exploitString);
System.out.println("=====");
System.out.printf("Exploiting PoC with the exploit string '%s'%n", exploitString);
System.out.println("=====");
System.out.println("PoC Output:");
System.out.println("-----");
System.out.println(output);
System.out.println("=====");
构造语句:$dns:address|www.google.com,实现了对Google的dns地址查询命令并成功返回,可见远程代码执行漏洞确实存在。
代码研究
下面从代码运行的视角来分析漏洞产生的原因。
先从StringSubstitutor.replace方法中跟入。
调用substitute解析传入的字符串。
跟进resolveVariable 。
这里获取的StringLookup,就是之前使用StringSubstitutor.createInterpolator()创建实例化对象的地方。
并在构造方法中调用了this.setVariableResolver(variableResolver),设置VariableResolver为InterpolatorStringLookup类。
继续跟入InterpolatorStringLookup的lookup方法中。
构造的JavaScript字符串被传入到lookup方法中。
而ScriptStringLookup类调用了lookup方法。
ScriptStringLookup类中的scriptEngine.eval函数获取到了传入的构造语句,直接执行。
关于这个引擎的介绍和使用可以参考这个链接:
https://www.qieseo.com/329754.html
Nashorn扩展可以使JVM在运行时动态调用JavaScript脚本,大大提升了开发时的灵活机动性,也正因此导致了Apache Commons Text远程代码执行漏洞。
原因分析
该漏洞存在于StringSubstitutor插值器对象中。插值器由StringSubstitutor.createInterpolator()方法创建,并允许StringLookupFactory中定义的字符串查找。这可以通过传递字符串“$prefix:name”来使用,其中前缀如下:
使用“script”、“dns”或“url”查找,将允许字符串在传递给插值器对象时,执行任意脚本。
由于Commons Text是一个库,因此插值器的具体用法将决定此漏洞的影响程度
虽然此特定代码片段不太可能存在于生产应用程序中,但令人担忧的是,在某些应用程序中,pocstring变量可能被攻击者控制。从这个意义上说,该漏洞与Log4Shell相呼应。但是,与Log4j中易受攻击的字符串替换相比,StringSubstitutor插值器的使用范围要小得多。并且这种插值器的性质意味着,将内容输入到易受攻击的对象中的可能性,比仅与Log4Shell中的此类字符串交互的可能性要小。
PoC/Exp
POC : https://github.com/SeanWrightSec/CVE-2022-42889-PoC
Maven对apache commons-text的依赖?
【中文标题】Maven对apache commons-text的依赖?【英文标题】:Maven dependency to apache commons-text? 【发布时间】:2016-07-22 08:00:09 【问题描述】:我想在 apache commons-text 项目中包含一个 Maven 依赖项。 我尝试将此依赖项添加到我的 pom 中:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>0.1-SNAPSHOT</version>
</dependency>
并包括以下存储库:
<repository>
<id>apache_snapshots_repo</id>
<url>http://repository.apache.org/snapshots</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
我从 commons-text 文档的 Dependency Repository Locations 部分获取了该存储库。但是,maven仍然无法解决依赖关系。
那么,为了使用 Apache commons-text,我应该配置哪个正确的依赖项和存储库?
【问题讨论】:
【参考方案1】:我很高兴为 Apache Commons Text 编写开发 has resumed,而 1.0 版是 recently released.
现在可以正常导入了。请记住,您需要将版本从 0.1-SNAPSHOT(如 OP 的问题)更改为 1.0.
这是它在Maven Central.上的页面
(完全披露——我也为这个项目做出了贡献)
【讨论】:
【参考方案2】:您必须下载源代码并自己构建它。似乎没有工件被部署到 Maven Central 或 Apache snapshots repository。
FWIW,自 May 2015 以来,该代码没有任何重大开发。
【讨论】:
以上是关于漏洞分析Apache Commons Text远程代码执行漏洞(CVE-2022-42889)的主要内容,如果未能解决你的问题,请参考以下文章
使用 UCanAccess 和 Apache Commons Net 从远程服务器中的数据库读取